Spring Security权限控制源码分析

本文深入剖析Spring Security权限控制的流程,从FilterSecurityInterceptor入口,讲解AccessDecisionManager、AbstractAccessDecisionManager及其策略,如AffirmativeBased。同时,探讨了配置信息、用户权限与请求权限的匹配过程,以及源码中的关键方法,如doFilter、beforeInvocation、getAttributes和decide。

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

流程图

在这里插入图片描述
在这里插入图片描述

类和接口介绍

  • FilterSecurityInterceptor:是整个权限判断流程的入口,包含着请求的相关信息;
  • AccessDecisionManager:是一个接口,有一个抽象实现(AbstractAccessDecisionManager)和三个具体实现(AffirmativeBased、ConsensusBased和UnanimousBased)
  • AbstractAccessDecisionManager: 该实现中维护者一组AccessDecisionVoter接口;
  • AccessDecisionVoter:对每个权限请求进行投票(Spring Security3之前的voter);
  • AffirmativeBased:积极的策略,即对于一个权限判断,不管有多少个Voter投不通过,只要有一个投票通过,该权限就通过;该策略是spring默认的判断策略;
  • ConsensusBased:共识的策略,即比较投票通过和不通过的票数,以票数最多的为准;
  • UnanimousBased:全部通过策略,即对于一个权限判断,不管有多少个投票通过,只要有一个投票不通过,该权限就不通过;
  • SecurityConfig:Spring Security的配置文件,用于配置哪些请求放行,哪些请求要经过过滤器以及tokenStoke、enhance等;
  • ConfigAttribute:FilterSecurityInterceptor会从SecurityConfig中读取配置信息,并封装成一组ConfigAttribute对象,每个ConfigAttribute对象代表着一个URL它所需要的权限;
  • Authentication:封装着当前用户所拥有的权限信息;
  • WebExpressionVoter: Spring Security3新增的voter,在web服务中它包含了所有的voter,即它投票过就通过、不过就不通过;

该流程中一共包含三组信息:1. FilterSecurityInterceptor所携带的用户请求信息,2. SecurityConfig配置的权限信息,3. Authentication当前用户所拥有的权限信息。 将这三组权限信息传递给AbstractAccessDecisionManager,它通过AccessDecisionVoter对当前请求是否拥有相应权限进行投票,spring根据设定的投票策略判断当前用户是否拥有他所请求资源的权限。

源码分析

FilterSecurityInterceptor:doFilter方法
public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值