使用shiro時,如果正常登陸(執行subject.login(token)成功)就能在全局通過SecurityUtils.getSubject().getPrincipal()獲取用戶信息。


使用shiro時,如果正常登陸(執行subject.login(token)成功)就能在全局通過SecurityUtils.getSubject().getPrincipal()獲取用戶信息。

之前的項目是OK的,新項目中突然出問題。現在給出我自己問題的解決方案。
shiro的配置中有個use-prefix選項,其配置有兩點需要注意:

    要在配置文件的最上邊(或者相關屬性的最前邊);
    一定要先於其它相關配置生效。

我原先的配置文件中的部分內容如下:

@Configuration
public class ShiroConfig {

    @Autowired
    private ManagerAccessControlFilter managerAccessControlFilter;

    @Bean
    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    @Bean
    public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();
        defaultAdvisorAutoProxyCreator.setUsePrefix(true);
        return defaultAdvisorAutoProxyCreator;
    }

 

我的filter是通過spring注解引用的,而且配置是在setUsePrefix前(這個時候這個倒是其次,即使放前邊也是不生效的)。
如果使用spring的注解,在進入配置文件前肯定是優先被加載的。所以將其更改如下:

@Bean
    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    @Bean
    public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();
        defaultAdvisorAutoProxyCreator.setUsePrefix(true);
        return defaultAdvisorAutoProxyCreator;
    }

    /**
     * ShiroFilterFactoryBean 處理攔截資源文件問題。
     * 注意:單獨一個ShiroFilterFactoryBean配置是或報錯的,因為在
     * 初始化ShiroFilterFactoryBean的時候需要注入:SecurityManager
     *
     Filter Chain定義說明
     1、一個URL可以配置多個Filter,使用逗號分隔
     2、當設置多個過濾器時,全部驗證通過,才視為通過
     3、部分過濾器可指定參數,如perms,roles
     *
     */
    @Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean  = new ShiroFilterFactoryBean();

        // 必須設置 SecurityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        ManagerAccessControlFilter managerAccessControlFilter = new ManagerAccessControlFilter();

        //自定義攔截器
        Map<String, Filter> filtersMap = new LinkedHashMap<>();
        filtersMap.put("managerAccessControlFilter", managerAccessControlFilter);
        shiroFilterFactoryBean.setFilters(filtersMap);

        //攔截器
        Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();

        filterChainDefinitionMap.put("/ping", "anon");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM