Spring Security 源码解析 -- 安全认证动态权限之基于内存模式

本文详细解读了SpringSecurity如何通过EnableWebSecurity开启安全认证,介绍了核心组件WebSecurityConfiguration和HttpSecurity,重点剖析了内存模式下的用户认证过程,包括AuthenticationManager、AuthenticationProvider和UserDetailsService。通过代码实例演示了基于内存模式的登录配置。

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

Spring Security 源码解析 -- 安全认证动态权限之基于内存模式

Spring Security 入门相关概念

Spring Security 是基于Spring IOC框架基础上进行实现的,所以Spring Security在实现安全认证、动态权限上使用了Spring 框架的一些家族语音的注解、特性等等。通过源码发现, 应用Spring Security 功能使用EnableWebSecurity注解即可启用功能, 最终以Filter链的形式来处理认证和权限的。下面就根据EnableWebSecurity注解来一一展开讲解Spring Security相关源码吧,并通过代码形式入门Spring Security的内存模式。

项目依赖包

首先,通过pom.xml文件处理Spring Security的依赖。Spring Cloud系列都是基于spring boot 2.3.3.RELEASE和spring cloud Hoxton.SR8.
在这里插入图片描述
在项目中依赖jar包如下:
在这里插入图片描述

EnableWebSecurity

在项目中新建WebSecurityConfig类, 继承WebSecurityConfigurerAdapter,并使用EnableWebSecurity就可以开启Spring Security 的安全认证了。
在这里插入图片描述
其中EnableWebSecurity注解通过源码只知,其下有三个注解,分别是WebSecurityConfiguration、SpringWebMvcImportSelector、Oauth2ImportSelector三个注解, 其中通过源码分析,SpringWebMvcImportSelector注入了一个WebMvcSecurityConfiguration
在这里插入图片描述
WebMvcSecurityConfiguration是用于处理Web请求下增加了Controller上的方法参数解析器,分别添加AuthenticationPrincipalArgumentResolver、CurrentSecurityContextArgumentResolver、CsrfTokenArgumentResolver三个参数解析器,用于处理AuthenticationPrincipal、CurrentSecurityContext两个注解的参数解析,及CsrfToken参数的解析。
在这里插入图片描述
OAuth2ImportSelector就不在此处展开讲解了。

WebSecurityConfiguration

WebSecurityConfiguration 是整个Spring Security框架处理的核心, 主要包含了WebSecurity、HttpSecurity及自定义的WebSecurityConfig继承WebSecurityConfigurerAdapter。
通过AutowiredWebSecurityConfigurersIgnoreParents.getWebSecurityConfigurers方法获取到自定义的WebSecurityConfigurer的Bean,用于后续配置WebSecurity和HttpSecurity做准备。
在这里插入图片描述
在这里插入图片描述
首先new了一个WebSecurity对象,并且获取到上面流程中的自定义的WebSecurityConfigurer,根据Order进行排序。并且不能出现相同排序自定义的WebSecurityConfigurer.
在这里插入图片描述
把自定义的WebSecurityConfigurer添加到WebSecurity对象中, 用于后面的build使用。
在这里插入图片描述
此方法中最终对WebSecurity进行build,生成Filter过滤器处理Web请求进行过滤拦截处理。
在这里插入图片描述
在build过程中,其中最重要的三个方法分别是init 、configure和performBuild
在这里插入图片描述
其中init 、 configure方法就是获取到对自定义的WebSecurityConfigurer进行init方法、configure方法调用, 而主要实现的功能都在抽象类WebSecurityConfigurerAdapter中。
在这里插入图片描述
在这里插入图片描述
WebSecurityConfigurerAdapter已经实现了非常重要的init方法,此方法会获取到HttpSecurity,而HttpSecurity就是用于设置所有Web请求相关的SecurityConfigurer,而这所有的SecurityConfigurer最终在HttpSecurity进行Build的时候会获取到Filter。
在这里插入图片描述
HttpSecurity在实例化时,会获取AuthticationManager。
在这里插入图片描述
默认获取AuthticationManager时,会从配置类AuthenticationConfiguration中得到。
在这里插入图片描述
而Authentication在获取AuthenticationManager时会加载一些默认的配置类数据, 分别是InitializeAuthenticationProviderBeanManagerConfigurer、InitializeUserDetailsBeanManagerConfigurer。
在这里插入图片描述
在这里插入图片描述
此处会注入一个AuthticationMangerBuilder,并设置事件发布器、密码编码器。
在这里插入图片描述

AuthticationBuilder在Build时,会进行上面两个配置类:InitializeAuthenticationProviderBeanManagerConfigurer、InitializeUserDetailsBeanManagerConfigurer中处理init 方法,并处理这两个类生成的内部类的configure方法。
在这里插入图片描述
最终以InitializeUserDetailsManagerConfigurer为例,此类会配置一个DaoAuthenticationProvider,此类根据authenticationProvider方法加入到AuthenticationManagerBuilder中的authenticationProviders列表中。
在这里插入图片描述
最后在AuthenticationBuilder类中的performBuild方法最终会返回ProviderManager对象,此对象就是管理所有的AuthenticationProvider,并且支持父级的AuthenticationManger对象。其中ProvidernManager是用于管理用户认证的, 实际认证是AuthenticationProvider接口的实现类, 默认是DaoAuthticationProvider进行用户认证。最终DaoAuthticationProvider会根据内存模式还是数据库模式的UserDetailsService进行加载用户数据来协助认证。
在这里插入图片描述
从此处可以看到,如果自定义父级AuthenticationManger可以直接覆盖configure(AuthenticationManagerBuilder auth)方法,方法如下所示:
在这里插入图片描述

所以基于上面,AuthenticationManger的默认设置就介绍完了,紧接着就是HttpSecurity的一些列的配置。其中AuthticationBuilder就是默认的DefaultPasswordEncoderAuthenticationManagerBuilder,其父级AuthticationBuilder就是上面介绍的默认AuthticationConfiguration配置中获取的,最后configure方法用于配置自定义的HttpSecurity了。
在这里插入图片描述
最后基于内存模式就只需要设置到如下即可:
在这里插入图片描述
通过localhost:1223/login 就可以登录啦, 但是此登录只是简单的登录,并没有设置登录成功的跳转页面。下一个篇章将介绍基于数据库模式进行登录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值