SpringSecurity之SecurityInteceptor
SecurityInteceptor
SecurityInteceptor是Spring Security的核心组件之一,其主要逻辑在AbstractSecurityInteceptor中实现,目前只有两个具体的子类实现:FilterSecurityInteceptor和MethodSecurityInteceptor。FilterSecurityInteceptor负责处理URL请求,MethodSecurityInteceptor负责处理方法请求。

Security Interceptor的逻辑处理主要分为pre-process和psot-process两个阶段。pre-process阶段主要逻辑是判断用户访问的是否是受保护的资源,如果是则进行相应的判定。psot-process主要是过滤器调用完成并返回后,对返回值进行判定。
其主要逻辑及调用顺序图如下:

pre-process阶段的主要逻辑集中在beforeInvocation()方法中:
1、 获取用户配置的源信息
2、 获取**SecurityContextPersistenceFilter**放置到SecurityContext中的Authentication对象
3、 AuthenticationManager根据Authentication中的用户信息对用户进行授权,并返回已经授权的Authentication对象
4、将已经授权的Authentication对象放置到SecurityContext以便后续进行使用
5、 AccessDecesionManager根据Authentication对象、配置信息和当前请求的信息来决定是否能够访问资源,如果能访问资源则继续,如果不能则抛出AccessDeniedException。
6、 如果上一步中决定当前请求能够访问资源,且如果用户配置了RunAsManager则对Authentication添加新的authorities;如果没有配置,则不会添加新的authorities
7、因为6中可能对Authentication做了更改,所以在此将Authentication对象放置到SecurityContext
8、经过上述步骤,此时请求已经可以访问后台资源了。
post-process阶段的主要逻辑集中在finallyInvocation()和afterInvocation()中:
1、 finallyInvocation()逻辑很简单,主要是重新设置SecurityContext,因为在SecurityInteceptor后面的过滤器、拦截器甚至是用户业务逻辑都可能改变SecurityContext。
2、finallyInvocation()主要是是由AfterInvocationManager实现。在当前的实现中,AfterInvocationManager将委托给PostInvocationAuthorizationAdvice的实例,后者最终可以过滤返回的对象,或者抛出AccessDeniedException
SecurityInteceptor做了很多工作,但是得益于其良好的设计,它的扩展性及可读性都很强。Spring Security有着很高的模块化程度,很好的遵循了单一职责原则。例如:SecurityInteceptor将认证和授权两项工作分别交给AuthenticationManager和AccessDecesionManager来做,而AuthenticationManager又将具体的权限获取工作委托给AuthenticationProvider;再比如:SecurityInteceptor将大量的基本逻辑单元由AbstractSecurityInteceptor实现,为子类提供基本的认证授权逻辑,而具体的使用策略交由子类决定,在扩展性和内聚性上做了充分的权衡等等,不一而足。
浙公网安备 33010602011771号