Apache Shiro 框架默认过滤器及 URL 匹配

前言

shiro 框架在 Java Web 应用中使用时,本质上是通过 filter 方式集成的,也就是说,它是遵循过滤器链规则,其通过一个 ShiroFilter 入口来拦截需要安全控制的 URL,然后进行相应的控制,本文将对 Shiro 框架默认过滤器及 URL 匹配做讲解。


1.Shiro 框架默认过滤器

1.1.ShiroFilter 的工作原理

ShiroFilter的工作原理

filterChainDefinitions 是 ShiroFilter 的属性,在 filterChainDefinitions 中可以对 Url 进行配置,看是否可以登录或安全权限的访问,详见后文。
由上图可以看出:浏览器过来的任何请求都会先经过 shiro 先过滤,先到达 AbstractShiroFilter.executeChain () 方法,去根据 request 解析出来的 url 找到对应的过滤链,然后执行过滤器链,直到成功才会执行 javaweb 本身的过滤器。

1.2.Shiro 框架默认过滤器

ShiroFilter 拦截需要安全控制的 URL,然后进行相应的控制,如果当前请求的 url 匹配 [urls] 部分的某个 url 模式,将会执行其配置的拦截器,例如:anon(anonymous)拦截器表示匿名访问(即不需要登 录即可访问),authc (authentication)拦截器表示需要身份认证通过后才能访问。Shiro 内置了很多默认的拦截器,比如身份验证、授权等相关的。
shiro 框架内置一系列的过滤器供使用,如下:org.apache.shiro.web.filter.mgt.DefaultFilter.java
shiro中默认的过滤器
shiro 中默认的过滤器:
shiro中默认的过滤器

这些过滤器分为两组,一组是认证过滤器,一组是授权过滤器,后面将会继续讲到。这些过滤器的 API可以点击查看。实际开发中,我们可以自定义拦截器来扩展功能以满足项目需求,例如:动态 url - 角色 / 权限访问控制的实现、根据 Subject 身份信息获取用户信息绑定到 Request(即设置通用数据)、验证码验证、在线用户信息的保存等。


2.Shiro 框架 URL 匹配

由于 ShiroFilter 通过拦截需要安全控制的 URL 进行相应的控制,urls 可能是 shiro 中处理 web 项目比较核心的部分。

2.1.RL 配置格式

[urls] 部分的配置,其格式是:”url = 拦截器 [参数],拦截器 [参数]

2.2.URL 匹配模式

url 模式使用 Ant 风格模式;
Ant 路径通配符支持?、*、**,注意通配符匹配不包括目录分隔符 “/”:
?:匹配一个字符,如 /admin? 将匹配 /admin1,但不匹配 /admin 或 /admin/;
*:匹配零个或多个字符串,如 /admin 将匹配 /admin、/admin123,但不匹配 /admin/1;
**:匹配路径中的零个或多个路径,如 /admin/** 将匹配 /admin/a 或 /admin/a/b。

2.3.URL 匹配顺序

URL 权限采取第一次匹配优先的方式,即从头开始使用第一个匹配的 url 模式对应的拦截器链。
如:
/bb/**=filter1
/bb/aa=filter2
/**=filter3
如果请求的 url 是 “/bb/aa”,因为按照声明顺序进行匹配,那么将使用 filter1 进行拦截。