【Spring Security开发安全的REST服务】- 7.2 SpringSecurity源码解析

SpringSecurity基本原理简介

在这里插入图片描述
绿色部分:负责身份认证的过滤器;
AnnoymousAuthenticationFilter:负责最后的认证过滤;
FilterSecurityInterceptor:决定了最终是否可以访问后面的Rest API;
ExceptionTranslationFilter:则会处理FilterSecurityInterceptor类中抛出的异常;

7.2.1、AnnoymousAuthenticationFilter类处理逻辑简介

在这里插入图片描述
途中的principal中的值如果是认证通过的情况下放的是userDetails接口中的值,如果没有认证成功,则放的是字符串anonymousUser,用户的角色为ROLE_ANONYMOUS;

7.2.2、认证逻辑简介

在这里插入图片描述授权流程描述:左侧的部分系统会去拿到一份,在SecurityConfig中配置的url权限信息,右侧部分会拿到当前访问的authentication所拥有的访问权限信息,再将当前的请求信息一起携带上后,交给访问决策管理者(AccessDecisionManager);管理者将这些信息交给一个投票者(AccessDecisionVoter)来根据给出的信息进行是否可以访问的投票,然后将投票信息交给AbstractAccessDecisionManager,这是一个接口,分别由三个实现类来根据选择的决策方法来决定是否可以访问。

决策器描述
AffirmativeBased有一个投过就过
ConsensusBased根据投过的和投不过的比较决定
UnanimousBased只要有一个投不过就不过

特别说明:WebExpressionVoter是在Spring3+之后由于Spring支持表达式之后引入的;SpringSecurity3+之后,这个投票器包办了以前所有的投票器的功能。

7.2.3、认证逻辑源码跟踪

我们将断点打在下图中的位置,从fi对象中我们可以看到整个过滤器链中依次的过滤器,包括几个,在之前的章节中我们自己手动添加的过滤器。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进入到该方法中,我们可以看到
在这里插入图片描述
回到之前的这个类中,在进行了attribute是否为空的校验后,在非空的情况下,系统将,authenticated(登录用户对象),object(请求信息),attributes(配置中对于当前请求的权限信息)传给了访问决策管理者去进行决策;

在这里插入图片描述
调用具体的三种实现来投票,Spring默认的是第一个实现;
在这里插入图片描述
这里在逻辑分析的时候说到,在Spring3+之后,都由这个vote来实现投票
在这里插入图片描述
在这里插入图片描述
在这里抛出异常后,将会由AbstractSecurityInterceptor继续抛出异常,然后由ExceptionTranslationFilter接到这个异常
在这里插入图片描述
在这里插入图片描述
断点处的后一行代码中在校验当前抛出的Exception是否是AuthenticationException,显然这里上面抛出的应该是一个AccessDeniedException,在下面代码中ase会被下面的方法赋值,然后调用处理方法处理这里的Exception。
在这里插入图片描述
在这里插入图片描述
这里给到的这个loginFormUrl是我们之前在下图中配置的登录界面的url
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值