SpringSecurity认证过程
创始人
2024-09-25 21:50:08
0

SpringSecurity采用的是责任链设计模式, 本质是一个过滤器链。

责任链模式

  • 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。

  • 在这种模式中,通常每个接收者都包含对另一个接收者的引用,而连接起来形成一条链。

  • 请求在这个链上传递,直到链上的某一个对象决定处理此请求。

  • 如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

 原理图:

 
总体认证过程

1、用户使用用户名和密码进行登录。
2、Spring Security 将获取到的用户名和密码封装成一个实现了 Authentication 接口的 UsernamePasswordAuthenticationToken。
3、将上述产生的 token 对象传递给 AuthenticationManager 进行登录认证。
4、AuthenticationManager 认证成功后将会返回一个封装了用户权限等信息的 Authentication 对象,如果没有认证成功抛出AuthenticationException异常,由ExceptionTranslationFilter获取,将调用 AuthenticationEntryPoint 引导用户重新登录,重新执行1的步骤,如果认证成功继续往下。
5、通过调用 SecurityContextHolder.getContext().setAuthentication(…) 将 AuthenticationManager 返回的 Authentication 对象赋予给当前的 SecurityContext。
在认证成功后,用户就可以继续操作去访问其它受保护的资源了,但是在访问的时候将会使用保存在 SecurityContext 中的 Authentication 对象进行相关的权限鉴定。权限鉴定通过AuthorizationFilter,有权限则能够访问资源。如果用户没有权限访问当前资源会抛出 AccessDeniedException,异常会被ExceptionTranslationFilter处理,返回一个表示不存在对应权限的 403 错误码。

认证流程是在 UsernamePasswordAuthenticationFilter 过滤器中处理的

 

AuthorizationFilter 

 它的实现类,表示当前访问系统的用户,封装了用户相关信息

他的主要作用是判断当前的用户用没有权限可以访问目标资源。

如果用户没有权限访问当前资源 会抛出 AccessDeniedException。异常会被ExceptionTranslationFilter处理。

 

ExceptionTranslationFilter


ExceptionTranslationFilter 是用来处理来自 AbstractSecurityInterceptor 抛出的 AuthenticationException 和 AccessDeniedException 的。

AbstractSecurityInterceptor 是 Spring Security 用于拦截请求进行权限鉴定的,其拥有两个具体的子类,拦截方法调用的 MethodSecurityInterceptor 和拦截 URL 请求的 FilterSecurityInterceptor。

当 ExceptionTranslationFilter 捕获到的是 AuthenticationException 时,将调用 AuthenticationEntryPoint 引导用户进行登录;如果捕获的是 AccessDeniedException,但是用户还没有通过认证,则调用 AuthenticationEntryPoint 引导用户进行登录认证,否则将返回一个表示不存在对应权限的 403 错误码。

在 request 之间共享 SecurityContext是如何实现的:

既然 SecurityContext 是存放在 ThreadLocal 中的,而且在每次权限鉴定的时候都是从 ThreadLocal 中获取 SecurityContext 中对应的 Authentication 所拥有的权限,并且不同的 request 是不同的线程,为什么每次都可以从 ThreadLocal 中获取到当前用户对应的 SecurityContext 呢?

在 Web 应用中这是通过 SecurityContextPersistentFilter 实现的,默认情况下其会在每次请求开始的时候从 session 中获取 SecurityContext,然后把它设置给 SecurityContextHolder,在请求结束后又会将 SecurityContextHolder 所持有的 SecurityContext 保存在 session 中,并且清除 SecurityContextHolder 所持有的 SecurityContext。

这样当我们第一次访问系统的时候,SecurityContextHolder 所持有的 SecurityContext 肯定是空的,待我们登录成功后,SecurityContextHolder 所持有的 SecurityContext 就不是空的了,且包含有认证成功的 Authentication 对象,待请求结束后我们就会将 SecurityContext 存在 session 中,等到下次请求的时候就可以从 session 中获取到该 SecurityContext 并把它赋予给 SecurityContextHolder 了,由于 SecurityContextHolder 已经持有认证过的 Authentication 对象了,所以下次访问的时候也就不再需要进行登录认证了。

相关内容

热门资讯

科普教程!炸金花链接房卡怎么搞... 微信游戏中心:新大海在哪里买打开微信,添加客服【8488009】,进入游戏中心或相关小程序,搜索“微...
玩家攻略,金花房卡制作链接大圣... 微信游戏中心:大圣大厅/新西部房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或...
安卓系统换苹果数据怎么,安卓到... 你是不是也和我一样,从安卓系统跳到了苹果的怀抱?换系统后,是不是发现手机里的数据怎么也迁移不过来?别...
秒懂百科”牛牛是如何购买的“新... 是如何购买的是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:113857776许多玩家在游戏中会购买...
科普教程!拼三张链接房卡怎么搞... 微信游戏中心:新蛮王在哪里买打开微信,添加客服【33903369】,进入游戏中心或相关小程序,搜索“...
正规平台有哪些,金花房卡制作链... 毛豆互娱房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
一秒了解”新详心房卡客服“人海... 一秒了解”新详心房卡客服“人海大厅房卡充值微信房卡充值 添加房卡批售商:微【113857776】复制...
我来教你/牛牛房卡制作链接嫦娥... 微信游戏中心:嫦娥大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
推荐一款!游戏推荐牛牛房卡出售... 您好!微信烛龙大厅/新道游大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(烛龙大厅/新...
实测分享”新神牛房卡“先锋大厅... 来教大家如何使用房卡充值房卡充值 添加房卡批售商:微【113857775】复制到微信搜索、直接添加房...
一分钟了解!斗牛房间怎么创建的... 今 日消息,火神大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
1分秒分析”新众亿怎么买房卡“... 来教大家如何使用怎么买房卡房卡充值 添加房卡批售商:微【113857775】复制到微信搜索、直接添加...
玩家须知”新下游是如何购买的“... 玩家须知”新下游是如何购买的“牛牛房卡充值游戏中心打开微信,添加客服【113857776】,进入游戏...
头条推荐!牛牛房卡代理火星大厅... 今 日消息,火星大厅/新道游房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更...
头条推荐!金花房卡批发价老神兽... 老神兽/海贝大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 ...
科技实测!游戏推荐牛牛房卡出售... 大众互娱是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
秒懂百科”黄帝大厅房卡购买“卡... 来教大家如何使用房卡充值房卡充值 添加房卡批售商:微【113857775】复制到微信搜索、直接添加房...
头条推荐!游戏推荐牛牛房卡出售... 头条推荐!游戏推荐牛牛房卡出售皇豪互娱/新道游/房卡怎么搞Sa9Ix苹果iPhone 17手机即将进...
正规平台有哪些,金花房卡怎么购... 您好!微信牛魔王/皇豪互娱大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(牛魔王/皇豪...
安卓系统引导加载程序,揭秘启动... 你有没有想过,当你打开手机的那一刻,安卓系统引导加载程序(Bootloader)是如何悄无声息地为你...