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
失效,头疼。。。
后来在网上搜索,发现这篇文章,问题与我相似。于是跟着他一步一步做。
-
修改jwtFilter的注入方式,改用
new
filters.put("jwt", new JwtFilter()); // 这里不能注入的jwtFilter,不然所有路径都被jwtFilter拦截
这样虽然解决了anon失效的问题,但是
JwtFilter
无法获取到jwtUtils
这个工具类 -
创建一个 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!!!