spring security中几大组件的作用和执行顺序
在Spring Security中,AuthenticationProvider
、GroupPermissionEvaluator
、PermissionEvaluator
、AbstractAuthenticationProcessingFilter
、DefaultMethodSecurityExpressionHandler
和 ManageSecurityExpressionRoot
都是与认证和授权相关的组件,它们各自有不同的职责和执行顺序。
-
AuthenticationProvider:
AuthenticationProvider
是Spring Security中用于认证的核心接口。它负责接收一个Authentication
对象,验证其凭据,并返回一个完全认证的Authentication
对象,或者在认证失败时抛出AuthenticationException
。AuthenticationProvider
可以自定义,以支持不同类型的认证机制。 -
GroupPermissionEvaluator:
GroupPermissionEvaluator
是一个特定于Spring Security的类,它用于评估用户是否具有对某个组的权限。这个类通常不是直接实现的,而是作为PermissionEvaluator
的一个实现来使用。在Spring Security 5.4及更高版本中,GroupPermissionEvaluator
已经被标记为过时(deprecated),因为它的功能被合并到了更通用的PermissionEvaluator
接口中。 -
PermissionEvaluator:
PermissionEvaluator
接口用于在方法安全和表达式评估中确定用户是否对给定的域对象有特定的权限。它提供了两个方法:hasPermission(Authentication authentication, Object targetDomainObject, Object permission)
和hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission)
。这些方法可以用来评估用户对特定对象的访问权限。 -
AbstractAuthenticationProcessingFilter:
AbstractAuthenticationProcessingFilter
是一个抽象的过滤器,它处理来自用户的认证请求。它通常不直接使用,而是通过继承来实现具体的认证逻辑,如UsernamePasswordAuthenticationFilter
用于处理表单登录。 -
DefaultMethodSecurityExpressionHandler:
DefaultMethodSecurityExpressionHandler
是Spring Security中用于处理方法安全性表达式的处理器。它允许在方法调用中使用安全表达式,如@PreAuthorize
、@PostAuthorize
等注解。 -
ManageSecurityExpressionRoot:
ManageSecurityExpressionRoot
是一个特殊的类,它提供了对安全上下文的访问,使得在表达式中可以方便地使用Authentication
对象和其他安全相关的信息。
执行顺序:
AbstractAuthenticationProcessingFilter
通常在过滤器链中首先被调用,它拦截登录请求并开始认证过程。AuthenticationProvider
随后被AuthenticationManager
调用,以验证Authentication
对象中的凭据。- 如果认证成功,
PermissionEvaluator
可能在后续的某个点被调用,以确定已认证的用户是否具有执行特定操作的权限。 GroupPermissionEvaluator
作为PermissionEvaluator
的一部分,可能在权限评估过程中被使用,尤其是在处理基于组的权限时。DefaultMethodSecurityExpressionHandler
和ManageSecurityExpressionRoot
通常在方法安全性检查时被使用,这通常发生在认证和授权过程之后。
这些组件共同工作,提供了一个灵活且强大的认证和授权框架。