ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

记一个jwt拦截的错误 为什么拦截会失效呢?

2021-07-10 14:57:31  阅读:226  来源: 互联网

标签:return securityManager jwt filterRuleMap new put 失效 拦截 public


看代码


@Configuration
public class ShiroConfig {

    @Bean
    public DefaultWebSecurityManager securityManager(ShiroRealmConfig shiroRealmConfig) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 将对于的realm设置进去
        securityManager.setRealms(shiroRealmConfig.allRealms());
        // 关闭session验证 需要用到dao
        DefaultSubjectDAO subjectDAO = (DefaultSubjectDAO) securityManager.getSubjectDAO();
        DefaultSessionStorageEvaluator evaluator = (DefaultSessionStorageEvaluator) subjectDAO.getSessionStorageEvaluator();
        // 关闭自带session 我们采用的是token机制
        evaluator.setSessionStorageEnabled(false);
        // dao设置
        subjectDAO.setSessionStorageEvaluator(evaluator);
        return securityManager;
    }

    /**
     * 通过工厂将安全管理器设置进去
     *
     * @param securityManager
     * @return
     */
    @Bean
    public ShiroFilterFactoryBean factory(DefaultWebSecurityManager securityManager) {
        // 1.创建工厂
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        // 2.创建map map中放入jwt拦截器
        JwtFilter jwtFilter = new JwtFilter();
        Map<String, Filter> filterMap = new HashMap<>();
        filterMap.put("jwt", jwtFilter);
        // 3.工厂加入map
        factoryBean.setFilters(filterMap);
        // 4.工厂设置安全管理器
        factoryBean.setSecurityManager(securityManager);
        // 5.创建url拦截map map中设置对应的规则


		//最关键的一点 必须使用LinkedHashMap 否则顺序会乱掉
        Map<String, String> filterRuleMap = new LinkedHashMap<>();
        
		

		//登陆请求之类的都是要放行的
        filterRuleMap.put("/api/vi/user/getLogin", "anon");
        //swagger2相关
        filterRuleMap.put("/doc.html/**", "anon");
        filterRuleMap.put("/swagger-resources/**", "anon");
        filterRuleMap.put("/webjars/**", "anon");
        filterRuleMap.put("/v2/**", "anon");
        //其他请求都要通过jwtFilter
        filterRuleMap.put("/**", "jwt");
        factoryBean.setFilterChainDefinitionMap(filterRuleMap);
        // 6.工厂加入对应的map 返回
        return factoryBean;
    }

    /**
     * 添加注解支持
     */
    @Bean
    @DependsOn("lifecycleBeanPostProcessor")
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true); // 强制使用cglib,防止重复代理和可能引起代理出错的问题
        return defaultAdvisorAutoProxyCreator;
    }

    /**
     * 添加注解依赖
     */
    @Bean
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    /**
     * 开启注解验证
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }
}

上面因为使用了HashMap 导致拦截地址的排列是按hash散列来排的 出现了不少错误

切记一定要按顺序排列 使用链表!!!!!!!!

标签:return,securityManager,jwt,filterRuleMap,new,put,失效,拦截,public
来源: https://blog.csdn.net/weixin_44353507/article/details/118635091

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有