springboot2.0+shiro1.4.0权限过滤不生效问题

之前一直使用spring+springmvc+hibernate+shiro框架,shiro用来控制管理后台的认证和权限问题,全部配置在xml文件中,没有任何问题。

最近切到springboot2.0,使用注解方式配置shiro后发现,配置为第1条规则的登录页的匿名访问总是被拦截为需要权限。

shiro具体配置和详细说明就不放了,以下是我的关键配置:

springboot2.0+shiro1.4.0权限过滤不生效问题

 

既然权限可以拦截到,说明shiro是生效的。

然后确认filterChainDefinitionMap使用有序集合LinkedHashMap,按理说应该是没有任何问题的。

打开org.apache.shiro日志trade,启动,日志如下:

springboot2.0+shiro1.4.0权限过滤不生效问题

没有发现问题。

 

springboot2.0+shiro1.4.0权限过滤不生效问题

这里发现了端倪,在shiro核心过滤filter之前有一个authenticationFilter,拦截了所有请求/*。

这个authenticationFilter就是我们上面配置的MyFormAuthenticationFilter,用来处理我们的表单,组装自定义token。

也就是请求还没到shiroFilterFactoryBean的时候先被上面这个拦截了,而他的规则刚好是/admin/*=authc,所以被跳转到无权限了。这不是我们想要的结果。

正常情况下应该只有shiroFilterFactoryBean拦截所有请求,再根据FilterChainManager匹配对应的filter,再进行doFilter()。

所以问题是springboot将本应是shiro的内置过滤器自动配置成了web-filter拦截了所有请求。

springboot2.0+shiro1.4.0权限过滤不生效问题

 

我的解决办法是把formAuthenticationFilter不注册为Bean,之后测试通过!

springboot2.0+shiro1.4.0权限过滤不生效问题

可能有别的更好的解决方法,欢迎交流!