【Shiro权限管理】4. Shiro工作流程

在上一篇总结中我们已经将Spring与Shiro的集成框架搭建起来了,下面就来
简单看一下Shiro的整个工作流程。

之前由于配置在shiroFilter的filterChainDefinitions中配置了一些访问权限:
<!--  
	配置哪些页面需要受保护. 
	以及访问这些页面需要的权限. 
	1). anon 可以被匿名访问
	2). authc 必须认证(即登录)后才可能访问的页面. 
-->
<property name="filterChainDefinitions">
    <value>
        /login.jsp = anon
        # everything else requires authentication:
        /** = authc
    </value>
</property>
所以当访问非login.jsp页面以外的页面时(哪怕页面不存在),都会自动跳转回
login.jsp页面。该流程是怎样一回事呢?

回顾我们在测试工程的web.xml中配置的shiroFilter过滤器:
<filter>
	<filter-name>shiroFilter</filter-name>
	<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	<init-param>
		<param-name>targetFilterLifecycle</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>

<filter-mapping>
	<filter-name>shiroFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
实际上在web.xml中配置的shiroFilter过滤器是一个入口,它类似于如Struts2/SpringMVC这种
web框架的前端控制器,是安全控制的入口点,其负责读取配置(如ini配置文件),然后判断URL
是否需要登录/权限等操作。

当访问任何路径时,会通过web.xml中配置的shiroFilter的拦截器(拦截机制是所有请求“/*”),

而shiroFilter拦截器会加载配置在Spring配置文件applicationContext.xml中的id同为“shiroFilter”的bean配置,

其中的filterChainDefinitions参数定义了一些页面的访问规则,

通过这些访问规则来对请求进行拦截或放行。

在配置shiroFilter时需要注意一个细节,就是Spring配置文件applicationContext.xml文件中的
shiroFilter配置中的id必须与web.xml中的shiroFilter中的<filter-name>属性一致。

如果不一致的话,会抛出NoSuchBeanDefinitionException异常,这是因为web.xml中的shiroFilter

对应的<filter-class>中的类DelegatingFilterProxy实际上是一个Filter的一个代理对象, 默认情况下, 

Spring会到IOC容器中查找和<filter-name>对应的 filter bean(也可以通过targetBeanName 的初始化参数来配置filter bean的id)。\

查看DelegatingFilterProxy源码,其中有这么一段:
protected Filter iniDelegate(WebApplicationContext wac) throws ServletException{
    Filter delegate = wac.getBean(getTargetBeanName(),Filter.class);
    if(){
        delegate,init(getFilterConfig());
    }
}
可以看到,DelegatingFilterProxy作为Filter过滤器代理对象,本身是没有过滤机制的,需要加载
用户自己配置有校验规则的实体Filter类,而该Filter类需要通过web.xml中配置的<filter-name>属性(即“TargetBeanName”)在Spring的配置文件applicationContext.xml中获取。
所以一旦DelegatingFilterProxy找不到相关类,代表这个代理对象就是无用的了,后面也无法执行
Shiro的一些校验工作,所以就会抛出NoSuchBeanDefinitionException的异常,提示开发者为该
代理对象配置Filter的实体bean,好让其去代理。

综上所述,Shiro的请求处理整体流程如下图:

转载请注明出处:http://blog.csdn.net/acmman/article/details/78312064

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值