一、配置web.xml
<!-- web.xml shiro-->
<fileter DelegatingFilterProxy urlpattern=/* 接收请求,查找并调用spring工厂中的ShiroFilter >
<!-- web.xml Spring -->
<listener ContextLoaderListener 负责监听项目启动,随之启动spring工厂,工厂启动后会存储在ServletContext中 >
<context-param 提供名为 contextConfigLocation的参数为监听器提供工厂配置 >
<!-- web.xml springMVC-->
<servlet DispatcherSerlvet urlPattern= / 中配置前端控制器
<filter CharacterEncodingFilter urlPattern= /* 解决Post请求中文请求参数乱码问题
1. 项目启动阶段
项目部署到Tomcat中,项目启动。
Tomcat只加载
中的配置的组件。
web.xml
1.1 Spring工厂启动
项目部署时,被触发,其父类
ContextLoaderListener
ContextLoader
的工厂启动方法被调用,完成Spring工厂的启动,所有单例bean创建。
启动工厂时,会通过
<context-param
读取配置文件。
启动完成后,工厂对象会存储在
中,即整个项目范围有效。
ServletContext
1.2 MVC工厂启动
DispatcherSerlvet
在项目启动或第一次被访问时启动,会负责启动SpringMVC的工厂,所有单例bean创建。
启动工厂时,会通过
<init-param
读取配置文件。
启动完成后,工厂对象会存储在
ServletContext
中,即整个项目范围有效。
启动完成后,该工厂对象会
。
将Spring工厂设置为父工厂
1.3 访问控制启动
1.3.1 ShiroFIlter启动
项目启动时,就完成实例化,是一个
DelegatingFilterProxy
/* 的Filter
。
负责在springMVC之前,接收所有请求,完成Shiro的
安全(访问)控制
逻辑。
其本身并不负责主要逻辑,在接收到请求后,会到spring工厂中查找ShiroFilter。
被定义在spring工厂中,负责生产
ShiroFilterFactoryBean
ShiroFilter
。
ShiroFilter负责,将一个新的
对象,唯一的
Subject
对象绑定在当前线程(
SecurityManager
ThreadLocal
)
以支持后续流程中( 我们的组件中,其他的组件中 ) 通过
获取shiro操作入口。
SecurityUtils.getSubject()
1.3.2 动态代理
MVC工厂启动时,会创建,其再配合
AuthorizationAttributeSourceAdvisor
,则其实在MVC工厂启动过程中,就会完成对 附加了如下注解的
<aop:config/>
进行代理,切入的
handler
分别如下。请求访问的是handler的代理对象
Advice
@RequiresAuthentication
@RequiresPermissions("user:insert")
@RequiresRoles("admin")
@RequiresGuest
@RequiresUser
AuthenticatedAnnotationMethodInterceptor 其中负责身份认证,会用到SecuirtyUtils.getSubject()
PermissionAnnotationMethodInterceptor 其中负责权限认证,会用到SecuirtyUtils.getSubject()
RoleAnnotationMethodInterceptor
GuestAnnotationMethodInterceptor
此5种advice任何一个执行时,都会:
UserAnnotationMethodInterceptor
SecurityUtils.getSubject();获得Subject对象,然后调用如下方法:
subject.isPermitted(...);
subject.isAuthenticated();
....这些就是Shiro的基本的权限校验方法。校验中会用到SM,RM,SeM,RM,CM等组件,这些组件早已在spring工厂中创建。
2. 请求处理
项目部署完毕,项目中的组件,基本除了懒加载的Servlet和非单例的bean,均已启动
2.1 访问控制
首先被
请求发送到服务器,tomcat找到对应的web项目,然后由该项目的相关组件来处理请求。
( /* ) 捕获,进行Shiro的环境初始化( 将SM 和 新建的Subject绑定在当前线程中 )。
DelegatingFilterProxy
过滤器放行后,进入到,然后执行handler的执行,准确的说是
DispatcherServlet
handler代理
的执行。
代理中会完成 handler注解中声明的 安全校验,校验通过后,则执行 handler中定义的逻辑。
3.请求处理流程
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP31EeFpXT3VFVOBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4MzN4UjM0kTMwITMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)