小Hub领读:
权限框架一般都是一堆过滤器、拦截器的组合运用,在shiro中,有多少个内置的过滤器你知道吗?在哪些场景用那些过滤器,这篇文章希望你能对shiro有个新的认识!
别忘了,点个 [在看] 支持一下哈~
前两篇原创shiro相关文章:
1、极简入门,Shiro的认证与授权流程解析
2、只需要6个步骤,springboot集成shiro,并完成登录
我们都知道shiro是个认证权限框架,除了登录、退出逻辑我们需要侵入项目代码之外,验证用户是否已经登录、是否拥有权限的代码其实都是过滤器来完成的,可以这么说,shiro其实就是一个过滤器链集合。
那么今天我们详细讨论一下shiro底层到底给我们提供了多少默认的过滤器供我们使用,又都有什么用呢?带着问题,我们先去shiro官网看看对于默认过滤器集的说明。
- http://shiro.apache.org/web.html#default-filters
When running a web-app, Shiro will create some useful default Filter instances and make them available in the [main] section automatically. You can configure them in main as you would any other bean and reference them in your chain definitions.
The default Filter instances available automatically are defined by the DefaultFilter enum and the enum’s name field is the name available for configuration.
翻译过来意思:
当运行web应用程序时,Shiro将创建一些有用的默认过滤器实例,并使它们在[main]部分自动可用。您可以像配置任何其他bean一样在main中配置它们,并在链定义中引用它们。
默认筛选器实例由DefaultFilter enum中定义,enum s name字段是可用于配置的名称。
于是我看了一下DefaultFilter
的源码:
public enum DefaultFilter {
anon(AnonymousFilter.class),
authc(FormAuthenticationFilter.class),
authcBasic(BasicHttpAuthenticationFilter.class),
logout(LogoutFilter.class),
noSessionCreation(NoSessionCreationFilter.class),
perms(PermissionsAuthorizationFilter.class),
port(PortFilter.class),
rest(HttpMethodPermissionFilter.class),
roles(RolesAuthorizationFilter.class),
ssl(SslFilter.class),
user(UserFilter.class);
...
}
终于知道我们常用的anon、authc、perms、roles、user过滤器是哪里来的了!这些过滤器我们都是可以直接使用的。但你要弄清楚这些默认过滤器,你还不得不去深入了解一下shiro更底层为我们提供的过滤器,基本我们的这些默认过滤器都是通过继承这几个底层过滤器演变而来的。
那么这些过滤器都有哪些呢?我们来看一个图:
![5aa5fc8b534cb8228a69a09ee937c383.png](https://img-blog.csdnimg.cn/img_convert/5aa5fc8b534cb8228a69a09ee937c383.png)
上面我标记了7个我们接下来要介绍的过滤器,我们一个个来介绍,弄清楚这些过滤器之后,相信你对shiro的认识会更深一层了。具体authc、perms、roles等这些默认过滤器与这7个过滤器有什么关系你就会明白。
1、AbstractFilter
这个过滤器还得说说,shiro最底层的抽象过滤器,虽然我们极少直接继承它,它通过实现Filter
获得过滤器的特性。
![7864fb963c2674bd4e880d431b40316e.png](https://img-blog.csdnimg.cn/img_convert/7864fb963c2674bd4e880d431b40316e.png)
完成一些过滤器基本初始化操作,FilterConfig
:过滤器配置对象,用于servlet容器在初始化期间将信息传递给其他过滤器。
2、NameableFilter
命名过滤器,给过滤器定义名称!也是比较基层的过滤器了,未拓展其他功能,我们很少会直接继承这个过滤器。为重写doFilter方法。
![f62ffc3c9241c0e13714ec88034ec460.png](https://img-blog.csdnimg.cn/img_convert/f62ffc3c9241c0e13714ec88034ec460.png)
3、OncePerRequestFilter
![9a31b415c2ffe1946d28ca5a7d4bccc9.png](https://img-blog.csdnimg.cn/img_convert/9a31b415c2ffe1946d28ca5a7d4bccc9.png)
重写doFilter方法,保证每个servlet方法只会被过滤一次。可以看到doFilter方法中,第一行代码就是String alreadyFilteredAttributeName = getAlreadyFilteredAttributeName();
然后通过request.getAttribute(alreadyFilteredAttributeName) != nu