springboot整合shiro (一) ShiroConfig配置類編寫

shiro實現用戶登錄認證需要三個核心api
Subject 用戶主體
SecurityManager 安全管理器
Realm 連接數據的橋樑

1. 導入shiro的maven依賴

導入shiro和spring整合的依賴

<dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.4.0</version>
</dependency>

2. 編寫Realm類

我們在項目中新建一個 shiro目錄並在裏邊新建一個UserRealm.java
該類要繼承 AuthorizationRealm
繼承後要實現裏面的兩個方法如下, 分別實現授權認證

package com.krlin.springbootshiro.shiro;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class UserRealm extends AuthorizingRealm {

    /**
     * 執行授權邏輯
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("執行授權邏輯");
        return null;
    }

    /**
     * 執行認證邏輯
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("執行認證邏輯");
        return null;
    }
}

2. ShiroConfig配置類

我們在shiro目錄下再新建一個ShiroConfig.java 配置類
在shiro的配置類中我們需要寫三個東西,分別如下:

package com.krlin.springbootshiro.shiro;

import org.springframework.context.annotation.Configuration;

@Configuration
public class ShiroConfig {

    /**
     * 創建 ShiroFilterFactoryBean
     */

    /**
     * 創建 DefaultWebSecurityManager
     */

    /**
     * 創建 Realm
     */
}

我們先來創建Realm

    /**
     * 創建 Realm
     * @Bean 的作用: 將該方法返回的對象放入spring容器, 以便給上邊的方法使用
     */
    @Bean
    public UserRealm userRealm() {
        return new UserRealm();
    }

然後創建 DefaultWebSecurityManager

    /**
     * 創建 DefaultWebSecurityManager
     * @Qualifier 註解 表示傳入的參數是下邊那個放入spring容器中的bean
     */
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 這裏要吧 userRealm 和 securityManager 關聯
        securityManager.setRealm(userRealm);
        return securityManager;
    }

最後創建 ShiroFailterFactoryBean

    /**
     * 創建 ShiroFilterFactoryBean
     */
    public ShiroFilterFactoryBean getShiroFilterFactoryBean (@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
        // 設置安全管理器        
        filterFactoryBean.setSecurityManager(securityManager);
        return filterFactoryBean;
    }

至此shiro配置類編寫完成, 完整代碼如下:

package com.krlin.springbootshiro.shiro;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ShiroConfig {

    /**
     * 創建 ShiroFilterFactoryBean
     */
     @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean (@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
        // 設置安全管理器
        filterFactoryBean.setSecurityManager(securityManager);
        return filterFactoryBean;
    }


    /**
     * 創建 DefaultWebSecurityManager
     * @Qualifier 註解
     * @Bean 註解裏的 name 指定放到spring容器中的名字, 若不寫, 默認爲方法名
     */
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 這裏要吧 userRealm 和 securityManager 關聯
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    /**
     * 創建 Realm
     * @Bean 的作用: 將該方法返回的對象放入spring容器, 以便給上邊的方法使用
     */
    @Bean
    public UserRealm userRealm() {
        return new UserRealm();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章