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);
MapfilterChains=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问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!