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