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 对象了,所以下次访问的时候也就不再需要进行登录认证了。

相关内容

热门资讯

车载安卓下载苹果系统,揭秘如何... 你有没有想过,你的车载系统竟然也能装上苹果系统?没错,就是那个我们平时手机上用的iOS系统!听起来是...
安卓电脑系统崩溃,原因分析及解... 最近我的安卓电脑系统突然崩溃了,这可真是让我头疼不已。你知道,我那台安卓电脑可是我日常工作和娱乐的好...
乐动力支持安卓系统吗,乐动力安... 最近有没有发现,你的手机里又多了一个健身APP?是不是在犹豫要不要下载乐动力呢?别急,别急,让我来给...
原生谷歌安卓系统下载,探索纯净... 亲爱的手机控们,你是否曾梦想拥有一部运行原生谷歌安卓系统的手机?那种纯净、高效、充满科技感的体验,是...
小米现在安卓系统优化,打造极致... 你有没有发现,最近小米的手机在安卓系统优化上可是下足了功夫呢?这不,我就来给你好好扒一扒,看看小米是...
云南游攻略系统和安卓,探寻彩云... 你打算去云南旅行了吗?那可得好好规划不然可就浪费了大好时光呢!今天,我就要给你安利一个超棒的云南游攻...
安卓系统怎么取消横屏,安卓系统... 你是不是也和我一样,有时候在使用安卓手机时,不小心把屏幕横过来,然后发现好多应用都是横着看的,简直让...
安卓系统慢动作摄影,捕捉精彩瞬... 你有没有发现,手机拍照已经不能满足我们追求个性的需求了?现在,安卓系统里的慢动作摄影功能,简直就像给...
安卓xp系统安装版,体验复古智... 你有没有想过,如果你的安卓手机也能装上XP系统,那会是怎样的体验呢?想象你手中的设备瞬间穿越回那个经...
怎么让安卓手机换回系统,轻松换... 亲爱的手机控们,你是不是也和我一样,对安卓手机的系统更新充满了期待?但是,有时候更新后的系统可能并不...
安卓系统界面停止运用,迈向未来 你知道吗?最近安卓系统界面上有个大变动,那就是它将停止运用啦!是不是有点惊讶?别急,让我带你一探究竟...
安卓系统中的drm服务,功能、... 你有没有发现,每次打开手机,安卓系统里总有一些神秘的玩意儿在默默运行?没错,说的就是那个让人又爱又恨...
华为OS是安卓系统吗,华为OS... 你有没有想过,华为的操作系统是不是安卓系统呢?这个问题,估计不少手机控都好奇过吧!今天,就让我带你一...
windows11安装安卓子系... 亲爱的电脑迷们,你是否对Windows 11的新功能感到好奇?今天,我要带你一起探索一个超级酷的功能...
安卓系统如何清密码,轻松解锁您... 手机解锁密码忘记了?别急,今天就来教你怎么轻松搞定安卓系统的密码清除问题。想象你正坐在沙发上,手里拿...
安卓11.0系统怎么关闭hd,... 你有没有发现,自从升级到了安卓11.0系统,手机界面看起来是不是更炫酷了?不过,有时候这高清的视觉体...
二手安卓原装系统,揭秘其性能与... 你有没有想过,手机更新换代的速度简直就像光速一样快?每次新款手机一出,旧款手机就变成了“古董”。但是...
安卓13系统还会卡,安卓13系... 你有没有发现,尽管安卓系统一直在更新迭代,但安卓13系统还是有点小卡呢?别急,今天咱们就来聊聊这个话...
2015年安卓系统版本,从Lo... 你有没有发现,手机里的安卓系统版本更新得可真是飞快啊!记得2015年那会儿,安卓系统版本可是发生了不...
安卓微信老是退出系统,探究原因... 你是不是也遇到了这样的烦恼?每次打开微信,还没聊两句,它就突然退出系统了!这可真是让人头疼啊。今天,...