Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法
在SpringBoot中集成Shiro,并使用JWT进行接口认证。
为了统一对Token进行过滤,所以自定义了一个JwtTokenFilter过滤器。
期间遇到了以下几个问题,这里逐一进行记录,以备日后查阅。
问题一:JwtTokenFilter无法使用@Autowired
因为自定义了一个JWTToken工具类,用来解析和创建Token,JwtTokenFilter中需要用到此工具类,这里本来可以直接手动进行new一个新的实例,但由于在Spring配置文件中定义了JWT签名密钥和过期时间,所以想使用Spring@ConfigurationProperties注解进行值得注入,所以这里必须不能手动new一个新的实例。
所以在ShiroConfiguration配置文件中将JwtTokenFilter过滤器交由Spring管理:
@Bean publicJwtTokenFilterJwtTokenFilter(){ returnnewJwtTokenFilter(); }
启动项目进行测试,JwtTokenFilter过滤器中JwtUtil类成功注入,但又遇到了另外一个问题。
问题二:anon过滤器失效
在问题一解决后,登录接口一直显示需要认证,所以在只能将ShiroFilterFactoryBean中定义的JwtTokenFilter又改为原先手动new:
@Bean(name="shiroFilter") publicShiroFilterFactoryBeanshiroFilterFactoryBean(){ ShiroFilterFactoryBeanshiroFilterFactoryBean=newShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager()); //注册自定义过滤器 MapfilterMap=newLinkedHashMap<>(8); //这里只能使用new新建实例 filterMap.put("authc",newJwtTokenFilter()); shiroFilterFactoryBean.setFilters(filterMap); Map filterChains=newLinkedHashMap<>(8); filterChains.put("/v1/admin/login","anon"); filterChains.put("/**","authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChains); returnshiroFilterFactoryBean; }
接着创建一个Spring的上下文管理工具类,代码如下:
packagecom.nwgdk.ums.common.util; importorg.springframework.beans.BeansException; importorg.springframework.context.ApplicationContext; importorg.springframework.context.ApplicationContextAware; importorg.springframework.stereotype.Component; /** *Spring上下文工具类 * *@authornwgdk */ @Component publicclassSpringContextUtilimplementsApplicationContextAware{ privatestaticApplicationContextapplicationContext; @Override publicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{ SpringContextUtil.applicationContext=applicationContext; } /** *获取上下文 */ publicstaticApplicationContextgetApplicationContext(){ returnapplicationContext; } /** *通过bena名称获取上下文中的bean */ publicstaticObjectgetBean(Stringname){ returnapplicationContext.getBean(name); } /** *通过类型获取上下文中的bean */ publicstaticObjectgetBean(Class>requiredType){ returnapplicationContext.getBean(requiredType); } }
接着,在JwtTokenFilter过滤器中通过以上工具类获取JwtUtil工具类:
if(StringUtils.isNotEmpty(jwtToken)){ if(jwtUtil==null){ jwtUtil=(JwtUtil)SpringContextUtil.getBean("jwtUtil"); } }
启动项目进行测试,成功登录。
总结
以上所述是小编给大家介绍的SpringBoot自定义Shiro过滤器无法使用@Autowired问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!