shiro+jwt登录认证anon配置无效

shiro+jwt登录认证anon配置无效

需求:使用shiro+jwt进行登录认证,希望可以自定义一些不需要认证的接口(登录接口等),其他统统交给jwtFilter进行token认证

原来shiroFilterFactoryBean的配置

@Autowired
JwtFilter jwtFilter;
@Bean
   public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
        Map<String, String> filterMap = new LinkedHashMap<>();
        filterMap.put("/login/**", "anon"); // 登录不需要认证
        filterMap.put("/**", "jwt"); // 主要通过注解方式校验权限
        chainDefinition.addPathDefinitions(filterMap);
        return chainDefinition;
    }
    @Bean("shiroFilterFactoryBean")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager,
                                                         ShiroFilterChainDefinition shiroFilterChainDefinition) {
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
        shiroFilter.setSecurityManager(securityManager);
        Map<String, Filter> filters = new HashMap<>();
        filters.put("jwt", jwtFilter); 
        shiroFilter.setFilters(filters);
        Map<String, String> filterMap = shiroFilterChainDefinition.getFilterChainMap();
        shiroFilter.setFilterChainDefinitionMap(filterMap);
        return shiroFilter;
    }

但是发现这样配置,所有的路径被jwtFilter拦截了,anon失效,头疼。。。
后来在网上搜索,发现这篇文章,问题与我相似。于是跟着他一步一步做。

  1. 修改jwtFilter的注入方式,改用new

    filters.put("jwt", new JwtFilter()); // 这里不能注入的jwtFilter,不然所有路径都被jwtFilter拦截
    

    这样虽然解决了anon失效的问题,但是JwtFilter无法获取到jwtUtils这个工具类

  2. 创建一个 Spring 的上下文管理工具类

    
    @Component
    public class SpringContextUtil implements ApplicationContextAware {
    	private static ApplicationContext applicationContext;
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            SpringContextUtil.applicationContext = applicationContext;
        }
        /**
         * 获取上下文
         */
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
        /**
         * 通过 bena 名称获取上下文中的 bean
         */
        public static Object getBean(String name) {
            return applicationContext.getBean(name);
        }
        /**
         * 通过类型获取上下文中的bean
         */
        public static Object getBean(Class<?> requiredType) {
            return applicationContext.getBean(requiredType);
        }
    }
    

    然后在JwtFilter中用以下代码来获取jwtUtils

     if (jwtUtils == null) {
            jwtUtils = (JwtUtils) SpringContextUtil.getBean("jwtUtils");
        }
    

虽然问题解决了,但是具体原因还是没搞明白o(╥﹏╥)o,有谁能够指点12!!!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值