shiro框架的使用

一.使用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);

相關文章
相關標籤/搜索