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