Shiro的过滤链设计机制?
Shiro对于请求的鉴权的实现也是通过过滤器(或者说是拦截器)来实现的,但是Spring项目中有拦截链机制,会有多个拦截器生效,包括系统内置的以及Shiro注入的,所以需要搞懂他的过滤的实现机制就需要去弄明白这些过滤器是如何过滤的。
过滤链是有顺序的,从上至下
2. 格式:地址匹配 认证规则
anno 匿名访问
user 请求认证,被rememberMe后,无需认证(通用界面)
authc 身份验证,敏感界面
Shiro对Servlet容器的FilterChain进行了代理,即ShiroFilter在继续Servlet容器的Filter链的执行之前,通过ProxiedFilterChain对Servlet容器的FilterChain进行了代理 即先走Shiro自己的Filter体系,然后才会委托给Servlet容器的FilterChain进行Servlet容器级别的Filter链执行 Shiro的ProxiedFilterChain执行流程
1.先执行Shiro自己的Filter链
2.再执行Servlet容器的Filter链(即原始的Filter)
而ProxiedFilterChain是通过FilterChainResolver根据配置文件中[urls]部分是否与请求的URL是否匹配解析得到的
即传入原始的chain得到一个代理的chain
Shiro内部提供了一个路径匹配的FiLterChainResolver实现: PathMatchingFilterChainResolver 其根据[urls]中配置的url模式(默认Ant风格) 即根据过滤器链和请求的url是否匹配来解析得到配置的过滤器链 而PathMatchingFilterChainResolver内部通过FilterChainManager维护过滤器链 比如DefaultFilterChainManager维护着url模式与过滤器链的关系 因此我们可以通过FilterChainManager进行动态动态增加url模式与过滤器链的关系DefaultFilterChainManager会默认添加
org.apache.shiro.web.filter.mgt.DefaultFilter中声明的过滤器