Springboot Shiro anno不启作用问题及解决
作者:Press777
在Shiro配置中遇到静态资源被拦截的问题,通过排除LinkedHashMap过滤次序和将过滤器手动创建而不是注册到容器中解决,同时,确保JwtUtil类也不注册到容器中,以避免请求报Not authorized错误
1. 分析
之前在Shiro中没有配置过静态资源过滤,这次在配置过程中给予静态资源anno发现还是会被拦截,查阅其它文章,基本上都是在说LinkedHashMap 过滤次序问题,但我最初就是这个,因此排除。
后再翻阅相关文章的时候,看到了一位博主在文章中说不要将过滤器注册到容器中即可,自己手动创建过滤器!!
然后查看我的代码,果然将过滤器注册到了容器中,将其拿掉,然后在shiroconfig中@Autowired JwtFilter jwtfilter 改成 new JwtFilter()即可。

2. 具体代码
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
Map<String, String> filterMap = new LinkedHashMap<>();
// swagger2页面
filterMap.put("/swagger-ui.html", "anon");
filterMap.put("/swagger/**", "anon");
filterMap.put("/swagger-resources/**", "anon");
filterMap.put("/v2/**", "anon");
filterMap.put("/webjars/**", "anon");
filterMap.put("/webjars.bycdao-ui/**", "anon");
filterMap.put("/configuration/**", "anon");
filterMap.put("/doc.html", "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", new JwtFilter()); // 修改处
shiroFilter.setFilters(filters);
Map<String, String> filterMap = shiroFilterChainDefinition.getFilterChainMap();
shiroFilter.setFilterChainDefinitionMap(filterMap);
return shiroFilter;
}
若在JwtFilter 使用到JwtUtil类判断tk是否过期等,而JwtUtil 同样不要注册到容器中,不然可能请求会报错
Not authorized to invoke method
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
