Shiro安全登录框架
?環境準備
本文使用Maven構建,因此需要一點Maven知識。首先準備環境依賴:?
Java代碼??- <dependencies>??
- ????<dependency>??
- ????????<groupId>junit</groupId>??
- ????????<artifactId>junit</artifactId>??
- ????????<version>4.9</version>??
- ????</dependency>??
- ????<dependency>??
- ????????<groupId>commons-logging</groupId>??
- ????????<artifactId>commons-logging</artifactId>??
- ????????<version>1.1.3</version>??
- ????</dependency>??
- ????<dependency>??
- ????????<groupId>org.apache.shiro</groupId>??
- ????????<artifactId>shiro-core</artifactId>??
- ????????<version>1.2.2</version>??
- ????</dependency>??
- </dependencies>???
添加junit、common-logging及shiro-core依賴即可。
?
2.3??登錄/退出
1、首先準備一些用戶身份/憑據(shiro.ini)
Java代碼??- [users]??
- zhang=123??
- wang=123??
此處使用ini配置文件,通過[users]指定了兩個主體:zhang/123、wang/123。
??
2、測試用例(com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest)?
Java代碼??- @Test??
- public?void?testHelloworld()?{??
- ????//1、獲取SecurityManager工廠,此處使用Ini配置文件初始化SecurityManager??
- ????Factory<org.apache.shiro.mgt.SecurityManager>?factory?=??
- ????????????new?IniSecurityManagerFactory("classpath:shiro.ini");??
- ????//2、得到SecurityManager實例?并綁定給SecurityUtils??
- ????org.apache.shiro.mgt.SecurityManager?securityManager?=?factory.getInstance();??
- ????SecurityUtils.setSecurityManager(securityManager);??
- ????//3、得到Subject及創建用戶名/密碼身份驗證Token(即用戶身份/憑證)??
- ????Subject?subject?=?SecurityUtils.getSubject();??
- ????UsernamePasswordToken?token?=?new?UsernamePasswordToken("zhang",?"123");??
- ??
- ????try?{??
- ????????//4、登錄,即身份驗證??
- ????????subject.login(token);??
- ????}?catch?(AuthenticationException?e)?{??
- ????????//5、身份驗證失敗??
- ????}??
- ??
- ????Assert.assertEquals(true,?subject.isAuthenticated());?//斷言用戶已經登錄??
- ??
- ????//6、退出??
- ????subject.logout();??
- }??
- ???
2.1、首先通過new IniSecurityManagerFactory并指定一個ini配置文件來創建一個SecurityManager工廠;
2.2、接著獲取SecurityManager并綁定到SecurityUtils,這是一個全局設置,設置一次即可;
2.3、通過SecurityUtils得到Subject,其會自動綁定到當前線程;如果在web環境在請求結束時需要解除綁定;然后獲取身份驗證的Token,如用戶名/密碼;
2.4、調用subject.login方法進行登錄,其會自動委托給SecurityManager.login方法進行登錄;
2.5、如果身份驗證失敗請捕獲AuthenticationException或其子類,常見的如:?DisabledAccountException(禁用的帳號)、LockedAccountException(鎖定的帳號)、UnknownAccountException(錯誤的帳號)、ExcessiveAttemptsException(登錄失敗次數過多)、IncorrectCredentialsException?(錯誤的憑證)、ExpiredCredentialsException(過期的憑證)等,具體請查看其繼承關系;對于頁面的錯誤消息展示,最好使用如“用戶名/密碼錯誤”而不是“用戶名錯誤”/“密碼錯誤”,防止一些惡意用戶非法掃描帳號庫;
2.6、最后可以調用subject.logout退出,其會自動委托給SecurityManager.logout方法退出。
?
從如上代碼可總結出身份驗證的步驟:
1、收集用戶身份/憑證,即如用戶名/密碼;
2、調用Subject.login進行登錄,如果失敗將得到相應的AuthenticationException異常,根據異常提示用戶錯誤信息;否則登錄成功;
3、最后調用Subject.logout進行退出操作。
?
如上測試的幾個問題:
1、用戶名/密碼硬編碼在ini配置文件,以后需要改成如數據庫存儲,且密碼需要加密存儲;
2、用戶身份Token可能不僅僅是用戶名/密碼,也可能還有其他的,如登錄時允許用戶名/郵箱/手機號同時登錄。?
轉載于:https://www.cnblogs.com/perfect-yuewei/p/5312247.html
總結
以上是生活随笔為你收集整理的Shiro安全登录框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机滤多少钱啊?
- 下一篇: 人脸检测流程及正负样本下载