1. 程式人生 > >Shiro安全框架--自定義認證

Shiro安全框架--自定義認證

上一篇簡單的介紹了Shiro的基礎認證,這一篇就簡單的舉個自定義認證的例子

1.和之前一樣先引入依賴:

    <!--匯入shiro-web的依賴 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
            <version>${shiro.version}</version>
        </dependency>
        <!-- 匯入shiro-core的依賴 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>${shiro.version}</version>
        </dependency>
        <!-- 匯入shiro-spring 的依賴-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>${shiro.version}</version>
        </dependency>

        <!-- 匯入/commons-logging的依賴 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

2.配置好自定義Shiro.ini的資訊

#自定義認證的全路徑限定名
myreal=com.zking.shiro.MyShrioRealm
securityManager.realms=$myreal

3.建立自定義 MyShiroReaml類 繼承 AuthorizingRealm(裡面有認證和授權的方法)

  /**
     * 授權
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }

    /**
     * 認證
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
       //獲取傳遞過來的資料
        UsernamePasswordToken usernamePasswordToken=(UsernamePasswordToken)authenticationToken;
        String username=usernamePasswordToken.getUsername();
        String pwd=usernamePasswordToken.getPassword().toString();
        String dbpwd="123456";
       //建立返回資料的認證物件 這裡的資料要去和資料庫的資料進行比對
        //simpleAuthenticationInfo認證資料
        //username根據使用者找到密碼
        SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(username,dbpwd,this.getName());
         //返回認證
        return simpleAuthenticationInfo;
    }

4.在測試類測試

 /**
     * shiro的自定義認證realm
     */
    @Test
    public void test2(){
        //讀取配置檔案 就會新建一個SecurityManager工廠物件 配置資訊就會放到物件裡面取 注意包
        Factory<SecurityManager> factory=  new IniSecurityManagerFactory("classpath:shiro2.ini");
        //獲取SecurityManager物件
        SecurityManager securityManager=factory.getInstance();
        //將securityManager設定在當前的環境中
        SecurityUtils.setSecurityManager(securityManager);
        //獲取當前操作物件
        Subject subject=SecurityUtils.getSubject();
        //例項化令牌
        UsernamePasswordToken usernamePasswordToken=new UsernamePasswordToken("admin","123456");
        //登入 需要一個令牌物件
        subject.login(usernamePasswordToken);
        //輸出看認證是否通過
        System.out.println(subject.isAuthenticated());




    }

返回結果為true.

自定義認證是根據名稱走的,名稱去找到密碼,在認證的時候就只認證密碼就行啦,這就要求名稱是唯一的.