集成Spring
(1)配置web.xml
![](https://img.haomeiwen.com/i4444657/55f664dfd3ba3db1.png)
(2)配置applicationContext.xml
![](https://img.haomeiwen.com/i4444657/69fabcecfc742d6c.png)
![](https://img.haomeiwen.com/i4444657/54d37ca1b8819c9d.png)
![](https://img.haomeiwen.com/i4444657/28a8baa65333bf9c.png)
![](https://img.haomeiwen.com/i4444657/42a11c1d97b9dd1a.png)
![](https://img.haomeiwen.com/i4444657/ba0b4992deaffc24.png)
![](https://img.haomeiwen.com/i4444657/48291eab0a50b565.png)
(3)自定义Realm
![](https://img.haomeiwen.com/i4444657/091c12db309ddc2d.png)
Shiro工作流程
与Web集成
Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截需要安全控制的URL,然后进行相应的控制。
ShiroFilter类类似于Struct2/SpringMVC这种web框架的前端控制器,是安全控制的入口点,其负责读取配置(如ini配置文件),然后判断URL是否需要登录/权限等工作。
ShiroFilter工作原理
![](https://img.haomeiwen.com/i4444657/c5a475eb51f8aaf6.png)
ShiroFilter我们在web.xml配置好后,在applicationContext.xml就可以配置filterChainDefinitions。
![](https://img.haomeiwen.com/i4444657/14c1369cc098edbe.png)
如果我们请求的URL在filterChainDefinitions没有配置,或者在里面配置了是可以匿名访问的,这个时候就可以直接访问到这个页面,否则就会被重定向到loginUrl这个页面。
DelegatingFilterProxy
applicationContext.xml配置的shiroFilter的id必须和web.xml文件中配置的DelegatingFilterProxy的<filter-name>一致。
![](https://img.haomeiwen.com/i4444657/cec17bc363c1e31e.png)
![](https://img.haomeiwen.com/i4444657/3e7b56ccff05693e.png)
否则配置文件加载的时候会抛出如下异常:
![](https://img.haomeiwen.com/i4444657/59904fad6feae405.png)
DelegatingFilterProxy实际上是Filter的一个代理对象,默认情况下,Spring会到IOC容器中查找和<filter-name>名字对应的filter bean,也可以通过targetBeanName的初始化参数来配置filter bean的id。
![](https://img.haomeiwen.com/i4444657/8a531ffd70960613.png)
![](https://img.haomeiwen.com/i4444657/252cbfe5b0db97e6.png)
权限URL配置细节
[urls]部分的配置,其格式是:"url=拦截器[参数],拦截器[参数]";如果当前请求的url匹配[urls]部分的某个url模式,将会执行其配置的拦截器。常用拦截器包括:
- anon(anonymous)拦截器表示匿名访问(即不需要登录即可访问);
- authc(authentication)拦截器表示需要身份认证通过后才能访问;
url模式使用Ant风格模式,Ant路径通配符支持?、、*,注意通配符匹配不包括目录分隔符“/”:
- ?:匹配一个字符,如/admin?将匹配/admin1,但不匹配/admin或admin/;
- *:匹配0个或多个字符串,如/admin将匹配/admin123,但不匹配/admin/1;
- **:匹配路径中的0个或多个路径,如/admin/**将匹配/admin/a或admin/a/b
url权限采用第一次匹配优先的方式,即从头开始使用第一个匹配的url模式对应的拦截器链。如:
/bb/**=filter1
/bb/aa=filter2
/**=filter3
如果请求的url是“/bb/aa”,因为按照声明顺序进行匹配,那么将使用filter1进行拦截。
网友评论