Spring Security基础原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Security基础原理相关的知识,希望对你有一定的参考价值。

参考技术A Spring Security:是一个提供身份验证,授权和保护以防止常见攻击的框架。 凭借对命令式和反应式应用程序的一流支持,它为Spring应用程序的安全提供实际标准。

Spring Security为身份验证,授权和针对常见漏洞的防护提供了全面的支持。 它还集成了三方库,以简化其使用。

Spring Security为身份验证提供了全面的支持。 身份验证是我们验证谁试图访问特定资源的身份的方法。 验证用户身份的常用方法是要求用户输入用户名和密码。 一旦执行了身份验证,我们就会知道身份并可以执行授权。

Spring Security提供了用于验证用户的内置支持。 分为两大主体:基于Servlet和WebFlux的身份验证。

Spring Security的PasswordEncoder接口用于对密码进行单向转换,以使密码可以安全地存储。

基于PasswordEncoder接口的实现类如下:

Spring提供了一个名为DelegatingFilterProxy的Filter实现,可以在Servlet容器的生命周期和Spring的ApplicationContext之间进行桥接。 Servlet容器允许使用自己的标准注册Filters,但是它不知道Spring定义的Bean。 DelegatingFilterProxy可以通过标准的Servlet容器机制进行注册,然后将所有工作委托给实现Filter的Spring Bean。

如上图所示,DelegatingFilterProxy是一个标准的Servlet Filter,当调用链路到DelegatingFilterProxy,DelegatingFilterProxy会找到达Spring管理的Filter,然后发起调用。

如上图所示,FilterChainProxy是Spring Security提供的特殊过滤器,允许通过SecurityFilterChain委派许多过滤器实例。

如上图所示,FilterChainProxy使用SecurityFilterChain确定应对此请求调用哪些Spring Security过滤器。

Security Filter是注册到FilterChainProxy而不是DelegatingFilterProxy的。原因如下:

Spring Security提供了以下Security Filter(包含顺序,通过FilterComparator配置相关顺序):

如上图表示的是异常处理过滤器ExceptionTranslationFilter的工作原理:

如上图所示,ProviderManager作为AuthenticationManager最常见的实现,ProviderManager认证时,将认证逻辑委托给AuthenticationProvider列表,不同AuthenticationProvider的执行不同的认证逻辑。

如果没有AuthenticationProvider可以执行身份验证,使用该父AuthenticationManager(通常是ProviderManager实例)进行认证。

一个父AuthenticationManager可能存在多个ProviderManager实例。 即具有相同身份验证(共享父AuthenticationManager)但又具有不同身份验证机制(不同ProviderManager实例)。

验证用户身份的最常见方法之一是验证用户名和密码, Spring Security为使用用户名和密码进行身份验证提供了全面的支持。

上图表示用户在表单提交用户名、密码的验证流程:

上图表示当客户端收到WWW-Authenticate响应头时,使用用户名和密码登录的流程:

Remember-Me(记住我),主要用于在一段很长的时间内(通常15天),用户只需要登录一次,就无需再登录了(前提是用户名、密码、秘钥不变的情况)。

原理:当用户登录成功时,服务端会向浏览器额外发送一个cookie(name = remember-me, value = token值),之后的请求都会携带这个cookie,当用户session失效时(比如2小时过后),该cookie携带到服务端触发自动登录。

当然,Remember-Me会存在一些安全问题,Remember-Me的token可以被用户代理捕获到,可以轻松通过该token去修改密码。因此在一些安全性重要的应用上面,不建议开启Remember-Me。

FilterSecurityInterceptor为HttpServletRequests提供授权,它作为安全筛选器之一插入到FilterChainProxy中(除此之外,Spring Security支持服务层方法授权还有域对象授权)。

回顾下前面学到的知识,用户登录认证成功后,会为当前用户生成一个Authentication对象,该对象包含了Principal、Credentials和Authorities;
该Authorities由GrantedAuthority(默认实现:SimpleGrantedAuthority)集合组成,GrantedAuthority接口只有一个方法,如下:

一般情况下GrantedAuthority由String表示,如果GrantedAuthority无法精确地表示为String,则GrantedAuthority被视为“复杂”,并且getAuthority()必须返回null。

刚刚讲到Spring Security调用AbstractSecurityInterceptor.beforeInvocation()进入前置处理阶段,该阶段的一个重点就是进行访问决策处理,由AccessDecisionManager相关实现来完成,AccessDecisionManager接口包含三个方法:

如上图所示,Spring Security提供了三个决策处理器AccessDecisionManager的实现类(AffirmativeBased、ConsensusBased、UnanimousBased),代表三种不同的决策处理器,当然也可以自定义决策处理器。决策处理器将决策逻辑委托给多个投票器AccessDecisionVoter(具体实现有:AuthenticatedVoter、RoleVoter、WebExpressionVoter等),接着AccessDecisionManager将投票结果进行整合,返回拒绝或者成功。

AccessDecisionManager实现类的具体描述如下:

AccessDecisionVoter通过返回int来表示投票的结果,有ACCESS_ABSTAIN(0,弃权),ACCESS_DENIED(-1,不通过)和ACCESS_GRANTED(1,通过),AccessDecisionVoter主要的实现类如下:

某些应用程序需要一种修改返回的对象的方法,因此Spring Security提供了一个方便的挂钩AfterInvocationManager,通过AfterInvocationManager来修改返回对象。

如上图所示,AfterInvocationManager有一个具体的实现AfterInvocationProviderManager,它轮询AfterInvocationProvider的列表。 每个AfterInvocationProvider都可以修改返回对象或引发AccessDeniedException。 实际上,由于前一个提供程序的结果将传递到列表中的下一个,因此多个提供程序可以修改该对象。

Spring Security原理

Spring Security(六)—SpringSecurityFilterChain加载流程深度解析

https://cloud.tencent.com/developer/article/1164113

SpringSecurity 源码分析之SecurityFilterchain的构建

https://blog.csdn.net/mingtiandexia/article/details/88880057

Spring Security(六)—SpringSecurityFilterChain加载流程深度解析

https://blog.csdn.net/m0_37834471/article/details/81210429

以上是关于Spring Security基础原理的主要内容,如果未能解决你的问题,请参考以下文章

spring Aop 到底是啥原理啊?

SpringSecurity基本原理

Spring Security+JWT简述

博客路线

Spring AOP面向方面编程原理:AOP概念

Spring基础:IOC底层原理