spring security3.x学习(7)_访问决策管理

本文详细解析了Spring Security中的授权机制,包括访问控制决策器(AccessDecisionManager)的工作原理及其实现类,以及如何利用这些组件进行权限验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继续学习授权的这个过程。。
spring security最后一个过滤器是FilterSecurityInterceptor,如果到了最后一个过滤器的话,用户登肯定是一个合法用户。
我们可以通过获取他的一系列权限信息来判断用户是否有权限可以访问。
那如何获取权限信息呢?
我们通过
SecurityContextHolder.getContext().getAuthentication().getAuthorities();
就可以获取到上下文中验证用户的一系列权限信息。



需要记住的是授权是一个二进制的决策——一个用户要么有要么没有访问一个受保护资源的权限。在授权中,没有模棱两可的情景。



看到这里,我们就不得不接触"访问控制决策器"(access decision manager),它负责做出授权决策。



在Spring Security中,o.s.s.access.AccessDecisionManager接口定义了两个简单而合理的方法,它们能够用于请求的决策判断流程:
supports:这个逻辑操作实际上包含两个方法,它们允许AccessDecisionManager的实现类判断是否支持当前的请求。
decide:基于请求的上下文和安全配置,允许AccessDecisionManager去核实访问是否被允许以及请求是否能够被接受。decide方法实际上没有返回值,通过抛出异常来表明对请求访问的拒绝。



和认证抛出异常(AuthenticationException)一样,授权中也会抛出异常,即AccessDeniedException(我们不去深入讨论了,了解机制就可以了)。


访问决策管理器(AccessDecisionManager)的实现类有3个:


无论是那个实现类,当他们进行决策时,使用如下方法时
public abstract void decide(Authentication paramAuthentication, Object paramObject, Collection<ConfigAttribute> paramCollection)
    throws AccessDeniedException, InsufficientAuthenticationException;
内部都会使用一个"访问决策投票器"(AccessDecisionVoter)来进行"投票决定"


AccessDecisionVoter<S>类包含了3个常量:
  public static final int ACCESS_GRANTED = 1;
  public static final int ACCESS_ABSTAIN = 0;
  public static final int ACCESS_DENIED = -1;
他们的意思是:

,,.非常有意思的是,以下的这个图,非常形象的描述了整个授权的过程:

spring security拦截以后,交给"访问决策管理"(AccessDecisionManager),然后去调用里边的decide()方法,decide()方法中,我们已经提到了,内部会调用投票机制,投票机制然后去做一些对比验证,去返回3个指(就是上边我们提到的3个值(ACCESS_GRANTED ,ACCESS_ABSTAIN,ACCESS_DENIED  ),从而看看用户是否有权限访问,如果有的话,将授权给用户访问的权限,否则的话,抛出异常(AccessDeniedException)。
遗憾的是,Spring  Security没有为我们提供太多的投票器,但是实现AccessDecisionVoter接口并在配置中添加我们的实现并不是一件困难的事情。
我们看一下"访问决策投票器"(AccessDecisionVoter)的两个实现类:

,.不错吧。这是两个比较基础的AccessDecisionVoter的实现类,认证和决策的投票器。

那好,关于访问决策管理的流程,我们就说完了,看到这,应该有个疑问,我是通过哪个拦截器,怎样进入访问决策管理的呢?
是通过AbstractSecurityInterceptor拦截请求的,通过查看源码或API,我们可以发现,其实AbstractSecurityInterceptor就是FilterSecurityInterceptor的一个父类,我们在想一下FilterSecurityInterceptor,他不就是spring security提供过滤器链中的最后一个吗、 呵呵。那也就清楚了,我们是如何走进这个访问决策管理中的了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值