Spring Security默认用户生成分析

2023-10-27

1.首先创建进行环境搭建

  • 创建SpringBoot项目
  • 引入SpringSecurity依赖
  • 编写简单的Controller

在这里插入图片描述

2.使用断点进行源码查看

①首先访问资源localhost:8080/hello

之后会被/login页面拦截,在/login页面拦截之后输入用户密码,会被formLogin()方法进行捕获(根据类SpringBootWebSecurityConfiguration显示

在这里插入图片描述

查看该方法,发现该方法应用了FormLoginConfigurer的实现,进入该类

在这里插入图片描述

②查看FormLoginConfigurer类

该类中调用了父类的UsernamePasswordAuthenticationFilter,因此肯定会被此Filter捕获到,会进入到该类中。

在这里插入图片描述

因此在该类中attempAuthentication方法处打断点,发送请求,点击登录之后,会进入到此处,可以发现最后返回的是authencicate方法,并且将验证请求信息传了进去,进入该方法查看。

③查看UsernamePasswordAuthenticationFilter类

在这里插入图片描述

④查看ProviderManager的authenticate方法

在这里插入图片描述

AuthenticationManager会调用providerManager,providerManager提供者会有很多种认证方式,如果返回一个完整的Authenticate,则代表认证成功。

根据源代码发现,authenticate会回调父类中的authenticate方法。由于父类中的AuthenticationManager是一个接口,因此接口的实现类只能靠子类,因此,他回调的时候是回调了他自己的authenticate的方法。

在这里插入图片描述

ProviderManager的父接口是AuthenticationManager

在这里插入图片描述

AuthenticationManager是一个接口。

在这里插入图片描述

再次进入到authentication方法,认证是通过providerManager不断的循环,直到能够找到能够认证通过的就认证成功,如果没有找到,那么就认证失败。

在这里插入图片描述

在这个回调之后,可以发现,终于有了自己的实现,进入该方法内。

在这里插入图片描述

⑤查看AbstractUserDetailsAuthenticationProvider类中的authenticate方法

进入该方法后,可以发现,这次并不是ProviderManager类中的方法了,而是AbstractUserDetailsAuthenticationProvider类中的方法,也就是说AbstractUserDetailsAuthenticationProvider类是ProviderManager类的实现类,他也实现了这个authenticate方法。该方法中调用了determineUsername方法,去判断当前身份是否为空,如果为空,则返回NONE_PROVIDED,如果不为空,则返回用户名。说明该方法并不是完成认证的方法。

在这里插入图片描述

determineUsername方法

在这里插入图片描述

retrieveUser是真正做认证的方法,因此进入该方法中进行查看。

在这里插入图片描述

⑥进入DaoAuthenticationProvider中的retrieveUser

retrieveUser中,可以看到该语句

在这里插入图片描述

UserDetails loadedUser = this.getUserDetailsService().loadUserByUsername(username);

说明他会拿着用户输入的用户名去UserDetailsService中的loadUserByUsername方法,因此只需要查看loadUserByUsername的具体实现即可。

查看 this.getUserDetailsService()的实现,可以发现他的结果是一个InMemoryUserDetailsManager,说明是基于内存的实现。

因此认证时所需要的数据源是Spring Security基于内存的实现。

⑦查看getUserDetailsService实现类。

在这里插入图片描述

UserDetailService

在这里插入图片描述

public interface UserDetailsService {

	UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

}

在这里插入图片描述

UserDetailService是顶层父接口,接口中loadUserByUserName方法是用来在用户认证时进行用户名认证方法,默认实现使用内存实现,如果想要修改数据库实现,只需要自定义UserDetailService实现,最终返回UserDetails实例即可。

⑧查看InMemoryUserDetailsManager中的loadUserByUserName

由UserDetailsManager的类可以发现,InMemoryUserDetailsManager类会对loadUserByUserName方法进行实现,查看该类

在这里插入图片描述

该方法对本类中的users进行获取,之后返回一个完整的users对象。

在这里插入图片描述

由于UserDetailsService默认是基于内存的配置,因此查看他的自动配置信息。

⑨UserDetailServiceAutoConfiguration

这个类的源码非常多,关键部分:

//该类生效条件
@Configuration(proxyBeanMethods = false)
//当类路径下存在AuthenticationManager.class时,默认引入Spring Security即会存在。
@ConditionalOnClass(AuthenticationManager.class)
//当类中存在ObjectPostProcessor.class时,该类为Spring容器中存在。
@ConditionalOnBean(ObjectPostProcessor.class)
//当前工程中没有自定义AuthenticationManager.class, AuthenticationProvider.class, UserDetailsService.class,
//				AuthenticationManagerResolver.class这四个实例时。
@ConditionalOnMissingBean(
		value = { AuthenticationManager.class, AuthenticationProvider.class, UserDetailsService.class,
				AuthenticationManagerResolver.class },
		type = { "org.springframework.security.oauth2.jwt.JwtDecoder",
				"org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector",
				"org.springframework.security.oauth2.client.registration.ClientRegistrationRepository" })
public class UserDetailsServiceAutoConfiguration {

	// ...

	@Bean
	@Lazy
	public InMemoryUserDetailsManager inMemoryUserDetailsManager(SecurityProperties properties,
			ObjectProvider<PasswordEncoder> passwordEncoder) {
		SecurityProperties.User user = properties.getUser();
		List<String> roles = user.getRoles();
		return new InMemoryUserDetailsManager(
				User.withUsername(user.getName()).password(getOrDeducePassword(user, passwordEncoder.getIfAvailable()))
						.roles(StringUtils.toStringArray(roles)).build());
	}

	// ...

}

默认情况下该类中的条件都能够满足,此时Spring Security会提供一个InMemoryUserDetailManager实例。

在这里插入图片描述

说明User是SecurityProperties的静态内部类,查看getUser方法,可以发现返回一个User,查看User。

在这里插入图片描述

该静态内部类中初始化了一个username为:user。

password为UUID随机生成的。

在这里插入图片描述

发现该类中出现@ConfigurationProperties注解,给属性注入,因此以后可以在配置文件中修改默认的username,password以及roles。

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Security默认用户生成分析 的相关文章

随机推荐

  • java中tip是什么意思_tip是什么意思

    tip指的是小费或者是尖端 指点的意思 tip美音可以是 t p 英音是 t p 第三人称单数可以写为tips 复数可以直接写为tips 现在分词是tipping 过去式是tipped 列句 每次给爸妈买些东西 总是能赚到小费 Every
  • IBM --AIX 常用命令

    创建组 mkgroup id 101 info 创建用户 mkuser pgrp staff home home campaign shell usr bin ksh groups staff campaign 解压 unzip campa
  • AcWing 425. 明明的随机数

    题目 明明想在学校中请一些同学一起做一项问卷调查 为了实验的客观性 他先用计算机生成了N个1到1000之间的随机整数 对于其中重复的数字 只保留一个 把其余相同的数去掉 不同的数对应着不同的学生的学号 然后再把这些数从小到大排序 按照排好的
  • golang学习demo4-goroutine并行测试

    知识点 go语言的routine的使用 通道chan的使用 想测试一下go的routine 就写了个求大量素数的程序 分别开1 99个协程进行求解 对比结果 首先是没有开协程的 下面是开了少数几个协程的程序 可以看到在 cnt 5 的时候速
  • Pytorch GPU版本简明下载安装教程

    1 根据自己的显卡型号下载显卡驱动并安装 这一步会更新你的显卡驱动 也可忽略第1步 如果第2步出现问题 返回执行第1步 点击这里下载英伟达显卡驱动 2 安装完成后 win cmd打开命令行 输入nvidia smi 查看GPU信息 右上角C
  • elementUIel-input和el-select宽度不一样

    在vue项目中 使用了element组件的 el input 和 el select组件 设置了相同的宽度 但是宽度显示不一样 给el select添加style width 100 就可以解决 没加样式之前的效果 添加样式 没加样式之后的
  • 机器学习入门教学——决策树

    1 简介 决策树算法是一种归纳分类算法 它通过对训练集的学习 挖掘出有用的规则 用于对新数据进行预测 决策树算法属于监督学习方法 决策树归纳的基本算法是贪心算法 自顶向下来构建决策树 贪心算法 在每一步选择中都采取在当前状态下最好 优的选择
  • 52类110个主流Java组件和框架

    以下排序是按照从技术组件到开发框架到代码工具 也有一些实在不好分类的 就放到最后了 WEB 容器 Tomcat https tomcat apache org Jetty https www jetty com JBoss https ww
  • JAVA命令行编译运行程序

    JAVA源程序名扩展名必须是 java 并且主文件名必须是 1 如有public类必须写public类的名 2 如没有public类则主文件名任意 编译源程序 javac d 目录名 源文件 以上命令中 d 目录名代表将编译产生的二进制码文
  • 用计算机对视频进行剪裁和编辑,Win10系统剪裁视频功能怎么用?windows10剪裁视频功能使用方法介绍...

    最近 有不少Win10正式版用户向小编咨询新系统上是否有好的视频剪切软件 答案是肯定的 我们只要利用Win10系统中的 照片 就可以快速实现剪裁视频操作 接下来 小编就向大家介绍windows10系统剪裁视频功能的使用方法 具体方法如下 1
  • HTTP GET参数的获取

    REQUEST METHOD的值一般包括POST和GET两种 GET参数的获取 在GET方法下 CGI程序无法直接从服务器的标准输入中获取数据 因为服务器把从标准输入接收到的数据编码到环境变量QUERY STRING 或PATH INFO
  • 乒乓球捡球机器人_捡球机器人

    本帖最后由 章 于 2020 12 31 08 41 编辑 27 副本 JPG 108 08 KB 下载次数 0 2020 12 24 20 17 上传 制作背景 我国的国球是乒乓球 有许多人从小开始学习打乒乓球 而在学习打乒乓的过程中 为
  • QT:在QTableView中使用各种自定义委托

    原文地址 https blog csdn net lhchen922 article details 38367719 相关文章 1 QT 在QTableView中使用各种自定义委托 https blog csdn net zgrjkflm
  • OpenHarmony 标准系统HDF框架之I2C驱动开发

    OpenHarmony 标准系统HDF框架之I2C驱动开发 主要内容 I2C 基础知识 I2C 基础知识 概念和特性 I2C 基础知识 协议 四种信号组合 I2C 调试手段 I2C 调试手段 硬件 I2C 调试手段 软件 HDF 框架下的
  • 关于前端开发常见状态码

    前端开发常见状态码 2开头代表服务器已接收请求 3开头代表重定向 需要进一步操作才能完成请求 4开头代表客户端错误 5开头代表服务器错误 2开头代表服务器已接收请求 200 代表请求成功 并返回了想要的数据 202 服务器接受请求 但未处理
  • 【JS】中文繁简转换

    不多说 比较简单 有对照表就行 下面贴源码 var 简繁对应表 锕 錒 锿 鎄 皑 皚 嗳 噯 蔼 藹 霭 靄 爱 愛 嫒 嬡 碍 礙 暧 曖 瑷 璦 庵 菴 谙 諳 鹌 鵪 鞍 鞌 埯 垵 铵 銨 暗 闇 晻 晻 翱 翶 翺 翺 鳌 鰲
  • Java面试总结,Redis宕机数据丢失解决方案,看完这篇彻底明白了

    一 前言 长文警告 事实上我不愿意写太长的文章 一面是太冗余 一方面读者容易疲倦 但是只要是涉及到源码级别的 就肯定篇幅不短 因为太短肯定没意义也解释不清楚 但是相信 耐心看完这个文章一定会对Spring源码有所收获 最近有很多读者面试的时
  • python报错urllib2.URLError:和error[Errno 104]

    在ubuntu16 04上使用python的skimage io imread 函数读取网页上的图片时 出现如题所示的错误 gt gt gt img io imread https cdn pixabay com photo 2015 02
  • 教你怎么使用Python对word文档进行操作

    使用Python对word文档进行操作 一 安装Python docx Python docx是专门针对于word文档的一个模块 只能读取docx 不能读取doc文件 说白了 python就相当于windows操作系统 QQ就是跑在wind
  • Spring Security默认用户生成分析

    1 首先创建进行环境搭建 创建SpringBoot项目 引入SpringSecurity依赖 编写简单的Controller 2 使用断点进行源码查看 首先访问资源localhost 8080 hello 之后会被 login页面拦截 在