shiro学习总结(一)----初识shiro
?
本系列內(nèi)容大多總結(jié)自官網(wǎng)和張開濤的《跟我學(xué)Shiro》
一、shiro簡介
1.1、shiro有什么用?
shiro是一個功能強(qiáng)大使用簡單的java安全框架,主要提供了五大功能:
1、認(rèn)證:用戶身份認(rèn)證,也就是登陸;
2、授權(quán)-訪問控制:通過一些配置,用戶登錄后會自動被賦予相應(yīng)的身份和操作權(quán)限,實現(xiàn)訪問控制;
3、密碼加密-保護(hù)或隱藏數(shù)據(jù)防止被偷窺;
4、會話管理
5、緩存
shiro還支持一些輔助特性,如Web應(yīng)用安全、單元測試和多線程,它們的存在強(qiáng)化了上面提到的五個要素。
?
1.2、shiro與Spring Security那個好?
Spring Security:除了不能脫離Spring,shiro具有的功能它都有,權(quán)限細(xì)粒度高,還提供許多其它的功能(筆者沒用過,具體哪些功能不清楚),而shiro則需要手動去實現(xiàn)。但是與shiro相比,操作太復(fù)雜,概念多,難理解,學(xué)習(xí)成本高?! ?/p>
shiro:使用簡單直接,上手快,控制粒度可糙可細(xì),擴(kuò)展性強(qiáng),自由度高,學(xué)習(xí)成本低。但功能比Spring Security要少些。
個人觀點:我認(rèn)為在滿足基本功能需求的情況下具有下面這兩個要素就可以稱之為好框架了:
一是簡單易用,學(xué)習(xí)成本低。二是擴(kuò)展性強(qiáng),自由度高。
shiro無疑比Spring Security更具有優(yōu)勢,雖然Spring Security功能更強(qiáng),但shiro具有的功能已經(jīng)能滿足大部分開發(fā)需求了;
二、shiro的外部結(jié)構(gòu)
什么是外部結(jié)構(gòu)?這里說的外部結(jié)構(gòu)就是指開發(fā)過程中會用到shiro API。
Subject:主體,代表了當(dāng)前“用戶”,這個用戶不一定是一個具體的人,與當(dāng)前應(yīng)用交互的任何東西都是Subject,如網(wǎng)絡(luò)爬蟲,機(jī)器人等;
? shiro的所有功能,如認(rèn)證,授權(quán)等,直接操作Subject實現(xiàn);
??所有Subject都綁定到SecurityManager,與Subject的所有交互都會委托給SecurityManager;
??可以把Subject認(rèn)為是一個門面;SecurityManager才是實際的執(zhí)行者;
SecurityManager:安全管理器;即所有與安全有關(guān)的操作都會與SecurityManager交互;且它管理著所有Subject;
可以看出它是Shiro的核心,它負(fù)責(zé)與后邊介紹的其他組件進(jìn)行交互,如果學(xué)習(xí)過SpringMVC,你可以把它看成DispatcherServlet前端控制器;
Realm:域,Shiro從從Realm獲取安全數(shù)據(jù)(如用戶、角色、權(quán)限),就是說SecurityManager要驗證用戶身份,那么它需要從Realm獲取相應(yīng)的用戶進(jìn)行比較以確定用戶身份是否合法;
也需要從Realm得到用戶相應(yīng)的角色/權(quán)限進(jìn)行驗證用戶是否能進(jìn)行操作;
可以把Realm看成DataSource,即安全數(shù)據(jù)源。
也就是說,shiro不自動提供給用戶權(quán)限,需要開發(fā)人員在代碼中通過Realm注入。
?
簡單點來說,最簡單的一個Shiro應(yīng)用:
1、應(yīng)用代碼通過Subject來進(jìn)行認(rèn)證和授權(quán),而Subject又委托給SecurityManager;
2、我們需要給Shiro的SecurityManager注入Realm,從而讓SecurityManager能得到合法的用戶及其權(quán)限進(jìn)行判斷。
三、一個簡單的shiro登錄實例
2.1、引入包
這里我用的maven構(gòu)建項目。
因為shiro依賴slf4j,maven僅幫我們下載slf4j的API,所以我們最好導(dǎo)入slf4j的實現(xiàn),否則會有警告。
POM文件
? ?Maven下載的包
2.2、創(chuàng)建ini配置文件
在ini配置文件中,輸入賬號和密碼。這里為了方便演示所以使用ini配置文件,在實際項目中這些數(shù)據(jù)都要放在數(shù)據(jù)庫中。
2.3、創(chuàng)建測試類
public static void main(String[] args) {// 1、讀取配置文件,初始化SecurityManager工廠Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");///2、獲取securityManager實例SecurityManager securityManager=factory.getInstance();///3、把securityManager實例綁定到SecurityUtils SecurityUtils.setSecurityManager(securityManager);///4、得到當(dāng)前執(zhí)行的用戶Subject currentUser=SecurityUtils.getSubject();///5、創(chuàng)建token令牌,用戶名/密碼UsernamePasswordToken token=new UsernamePasswordToken("java1234", "12345");try{///6、身份認(rèn)證 currentUser.login(token); System.out.println("身份認(rèn)證成功!");}catch(AuthenticationException e){e.printStackTrace();System.out.println("身份認(rèn)證失敗!");}// 退出 currentUser.logout();}1、通過 new IniSecurityManagerFactory 并指定一個 ini 配置文件來創(chuàng)建一個 SecurityManager 工廠,這種方法只是用于測試,實際開發(fā)不使用。
2、獲取 SecurityManager 并綁定到 SecurityUtils,這是一個全局設(shè)置,設(shè)置一次即可,實際開發(fā)中在配置中完成;
3、通過 SecurityUtils 得到 Subject,其會自動綁定到當(dāng)前線程;如果在 web 環(huán)境在請求結(jié)束時需要解除綁定;然后獲取身份驗證的 Token,如用戶名 / 密碼;
4、調(diào)用 subject.login 方法進(jìn)行登錄,其會自動委托給 SecurityManager.login 方法進(jìn)行登錄;
5、如果身份驗證失敗請捕獲 AuthenticationException 或其子類,常見的如:
DisabledAccountException(禁用的帳號)、LockedAccountException(鎖定的帳號)、
? ? UnknownAccountException(錯誤的帳號)、ExcessiveAttemptsException(登錄失敗次數(shù)過多)、
IncorrectCredentialsException (錯誤的憑證)、ExpiredCredentialsException(過期的憑證)等,具體請查看其繼承關(guān)系;
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/jsyllhb/p/8666511.html
總結(jié)
以上是生活随笔為你收集整理的shiro学习总结(一)----初识shiro的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NPashaP的二分图源码部分
- 下一篇: [C#学习笔记]C#中的decimal类