SpringBoot 整合 Shiro 實現登錄攔截

一、搭建一個SpringBoot 項目。

二、導入shiro 相關座標:

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

三、與啓動類同目錄創建config 包:

實現抽象類AuthorizingRealm 中的方法:

package com.itmao.config;

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;

//from fhadmin.cn
public class UserRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("執行了doGetAuthorizationInfo方法");
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        return null;
    }
}

編寫配置類:

package com.itmao.config;

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;

import java.util.LinkedHashMap;
import java.util.Map;

//from  fhadmin.cn
@Configuration
public class ShiroConfig {

    // ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

        // 設置安全管理器
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);

        // 設置shiro內置過濾器
        Map<String,String> filterMap = new LinkedHashMap<>();
        /*
        map 中value 的意義
        * anon: 無需認證就可以訪問資源;
        * authc:必須認證後才能訪問資源;
        * user:必須擁有“記住我”功能才能訪問資源;
        * perms:擁有對某個資源的權限才能訪問資源;
        * role:擁有某個角色權限才能訪問資源
        * **/
        filterMap.put("/user/*","authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);

        // 設置登錄頁面url
        shiroFilterFactoryBean.setLoginUrl("/toLogin");
        return shiroFilterFactoryBean;
    }

    // DefaultWebSecurityManager
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("getUserRealm") UserRealm userRealm){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();

//        關聯UserRealm
        defaultWebSecurityManager.setRealm(userRealm);
        return defaultWebSecurityManager;
    }

    // 創建 realm 對象,需要自定義類
    @Bean
    public UserRealm getUserRealm() {
        return  new UserRealm();
    }
}

四、編寫測試頁面和頁面跳轉的Controller。

上面設置user 目錄下所有資源的訪問均需認證後纔可訪問,未認證訪問時,會自動跳轉到登錄頁面,即表示登錄攔截成功。

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