一.使用shiro框架須要引入的依賴前端
<!--引入shiro的依賴-->
<!-- shiro start --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version> </dependency>
<!--日誌包--> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.6</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.6</version> </dependency>
2.配置ini文件(代替數據庫)數據庫
# 定義用戶信息
[users]
admin=123
jack=111
# 配置自定義的realm(自定義數據庫認證規則) [main] #配置自定義realm的包路徑 myRealm=com.woniu.shirorealm.MyRealm #指定securityManager的實現類 securityManager.realms=$myRealm
3.配置myRealm的Java代碼apache
package com.woniu.shirorealm; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; /** * */ public class MyRealm extends AuthorizingRealm { //認證規則 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { //1.principal 身份信息(用戶對象) Object printipal = token.getPrincipal(); //2.驗證用戶是否存在 if (!"admin".equals(printipal)){//admin須要從數據庫裏面查出來 return null; } //帳號對應的數據庫密碼 Object credentials ="123";//密碼須要根據帳號從數據庫裏查出來 //構建一個AuthenticationInfo 認證信息對象 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(printipal, credentials, this.getName()); /** * 將真實憑證credentials(從數據庫查詢的數據)與token中的password進行eauals()比較; * 若相同:返回authenticationInfo * 不相同 拋出IncorrectCredentialsException不正確的憑據(密碼錯誤) */ return authenticationInfo; } //受權規則 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; } }
myRealm的工做原理:api
1.根據subject.login(token)能夠將token傳到myrealm的方法裏安全
2.從token中獲得用戶傳來的用戶帳號和密碼框架
3.根據用戶的帳號從數據庫查找該用戶,不存在則返回nullide
4.若用戶存在則須要獲得用戶的密碼,構建一個認證信息的對象 authenticationInfo = new SimpleAuthenticationInfo(待認證對象,數據庫的密碼,當前realm對象)測試
5.將數據庫的密碼與token中的密碼進行equals判斷,相同則return authenticationInfo 不一樣則 throw new IncorrectCredentialsException()this
4.測試代碼spa
package com.woniu.shirorealm; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; /** * Hello world! * */ @SuppressWarnings("all") public class App { public static void main( String[] args ) { //1.建立Shiro安全管理工廠 IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:info_realm.ini"); //2.從工廠中建立SecurityNanager安全管理對象 SecurityManager securityManager = factory.getInstance(); //3.將安全管理對象與shiro環境綁定 SecurityUtils.setSecurityManager(securityManager); //4.建立待校驗的subject(用戶) Subject subject = SecurityUtils.getSubject(); //5.建立帳號密碼令牌(輸入的是從前端傳過來的值) UsernamePasswordToken token = new UsernamePasswordToken("admin", "123"); //6.開始認證 try { subject.login(token);//會進入到MyRealm中 }catch (IncorrectCredentialsException e){//不正確的憑證異常 System.out.println("密碼錯誤"); }catch (UnknownAccountException e){//未知的帳號異常 System.out.println("用戶名錯誤"); }catch (AuthenticationException e){//認證異常 System.out.println("未知錯誤"); } //7.認證是否經過的判斷條件 boolean authenticated = subject.isAuthenticated(); System.out.println(authenticated); } }
1.利用IniSecurityManagerFactory加載配置文件並建立工廠(factory) =>
2.利用工廠建立安全管理對象(securityManager=factory.getInstance()) =>
3.將安全管理對象與shiro環境綁定SecurityManager.setSecurityManager(securityManager) =>
4.建立待校驗的subject(用戶) =>
5. 建立帳號的密碼令牌new UsernamePasswordToken("前端帳號","前端密碼") =>
6.進行校驗subject.login(token);