PS:欢迎转载,但请注明出处,谢谢配合。
Shiro过滤器执行链路梳理
一、前言
本文章主要针对认证过滤器(FormAuthenticationFilter)和授权过滤器(RolesAuthorizationFilter),说明Shiro过滤器拦截到请求后,是如何一步步执行到认证过滤器和授权过滤器中的方法,最终调用到Realm中的方法。
补充说明:文章中的源码,基于shiro-web-1.4.0.jar(通过shiro-spring-1.4.0.jar传递依赖而来)。
二、Shiro过滤器是如何加入Spring容器中的
Shiro集成时,会定义一个bean: ShiroFilterFactoryBean,实现了FactoryBean接口,根据spring原理可知,实现该接口的类返回给spring容器的bean实际是调用getObject()方法返回的。该方法最后返回的是一个SpringShiroFilter,其父类实现了javax.servlet.Filter接口(web应用过滤器接口),从而将shiro过滤器加入到了springboot应用中,进而添加到servelt容器中进行拦截请求。
具体UML类图如下:
三、过滤器作用
1、认证过滤器(FormAuthenticationFilter)
可以指定某些url,必须登录后才可进行访问,否则拒绝访问。
2、授权过滤器(RolesAuthorizationFilter)
可以指定某些url,必须具有哪些role角色,才可进行访问,否则拒绝访问
四、过滤器执行链路梳理
1、由最上面的UML类图中可知,Shiro过滤器的入口方法为OncePerRequestFilter中的doFilter方法,到具体过滤器的执行链路如下:
2、其中,RolesAuthorizationFilter的isAccessAllowed方法,最终会执行到业务Realm的 doGetAuthorizationInfo 方法(授权方法)
3、业务Realm 的 doGetAuthenticationInfo 方法(认证方法),是在登录Controller中调用 subject.login 方法,最终执行到的
五、认证和授权过滤器的执行优先级
从测试效果来看,shiro中的授权过滤器,执行优先级比认证过滤器要高:
先进入了授权过滤器,再进入了认证过滤器。
通过查看AdviceFilter源码,发现doFilterInternal方法如下,与上面描述相符。