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