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