1. 授权前提
- 所有的认证令牌对象
Authentication保存了一组GrantedAuthority对象,表示授予访问者(当事人principal)的权限。
1.GrantedAuthority对象是被AuthenticationManager在认证访问者期间插入到Authentication中的。这些GrantedAuthority对象会被AccessDecisionManager在对该访问者对于某个安全对象做出授权决定时使用;
2.GrantedAuthority是一个接口,仅有一个方法定义String getAuthority(),用于获取所受权限的字符串形式表示;
3.Spring Security内置了一个GrantedAuthority具体实现SimpleGrantedAuthority,该实现支持在将权限字符串转成GrantedAuthority类型对象;
4.Spring Security内置的AuthenticationProvider都使用SimpleGrantedAuthority往Authentication填充权限信息;
2. 授权过程 (Authorization)
-
有授权控制的安全对象(
secure object)的分类- 方法调用(
method invocation) - web请求(
web request)
- 方法调用(
-
授权动作调用者
- 拦截器
AbstractSecurityInterceptor
- 拦截器
-
授权控制阶段
-
调用前授权处理 (
pre-invocation handling) :AccessDecisionManager-
AccessDecisionManager被AbstractSecurityInterceptor调用,负责决定是否授权访问者继续访问目标安全对象; -
AccessDecisionManager是一个接口,定义了三个方法void decide(Authentication authentication, Object secureObject, Collection<ConfigAttribute> attrs) throws AccessDeniedException;该方法是投票过程, 有三个参数 :
Authentication authentication代表访问者当事人,是访问者的认证令牌,包含了访问者的权限Object secureObject表示目标安全对象,比如是一个方法调用MethodInvocationCollection<ConfigAttribute> attrs表示访问目标安全对象所需要的权限
boolean supports(ConfigAttribute attribute);检测
ConfigAttribute attribute是否是当前AccessDecisionManager支持的ConfigAttribute类型。boolean supports(Class clazz);检测
Class clazz是否是当前AccessDecisionManager支持的secureObject。 -
开发者可以提供自己的
AccessDecisionManager实现 -
Spring Security内置的AccessDecisionManager实现是基于投票机制的(voting)AbstractAccessDecisionManager是Spring Security内置的AccessDecisionManager实现的抽象基类AbstractAccessDecisionManager使用一组AccessDecisionVoter投票者投票表决进行授权AccessDecisionVoter是一个接口,建模投票者这一概念- 每个
AccessDecisionVoter对每次投票可以给出如下三个结论中的一个- 否决 :
ACCESS_DENIED - 弃权 :
ACCESS_ABSTAIN - 赞同 :
ACCESS_GRANTED
- 否决 :
AbstractAccessDecisionManager有三个内置实现AffirmativeBased– 一票通过即可放行ConsensusBased– 多数投票通过可放行UnanimousBased– 全票通过才放行
-
-
调用后授权处理 (
after-incocation handling) :AfterInvocationManager- 通过
AfterInvocationManager可以对受保护的安全对象的返回对象做修改 Spring Security提供了AfterInvocationManager的一个内置实现AfterInvocationProviderManagerAfterInvocationProviderManager维护一组AfterInvocationProvider完成指定的任务对受保护的安全对象的返回对象逐一应用这些
AfterInvocationProvider
- 通过
-
-
参考文章
本文深入探讨Spring Security中的授权机制,包括GrantedAuthority的概念、如何使用AuthenticationManager和AccessDecisionManager进行权限控制,以及调用前后授权处理的具体流程。介绍了投票机制下的AccessDecisionManager实现,并解释了AfterInvocationManager的作用。
1万+

被折叠的 条评论
为什么被折叠?



