SpringSecurity6 | 默认用户生成

news2024/11/28 4:50:45

SpringSecurity6 | 默认用户生成

公众号封面

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: Java从入门到精通
✨特色专栏: MySQL学习
🥭本文内容:SpringSecurity6 | 默认用户生成
📚个人知识库 :知识库,欢迎大家访问

学习参考 :

  • 讲师:孙帅老师
  • 课程:孙哥说SpringSecurity6

image-20231030235443828

1.前言

大家好,我是Leo哥🫣🫣🫣,前几周忙工作,博客等事宜都给耽搁,这不这周闲一点了,抓紧开始更SpringSecurity。接到上一节,我们学习了SpringSecurity的默认登录页并通过源码去简单看了一下实现。这一节呢,我们主要来学习当我们启动项目之后,默认用户以及默认密码是如何生成的。好了,话不多说让我们开始吧😎😎😎。

2.问题

其实第二节内容中,我们就简单了解了项目启动之后,SpringSecurity会给我生成一个默认的用户user,以及一个随机的uuid密码。但是我们只是简单了解一下,他是因为在用户相关的自动化配置类在 UserDetailsServiceAutoConfiguration 里边,在该类的 getOrDeducePassword 方法中生成的,我们再来简单回顾一下。

image-20231205200658829

可是这个用户user为什么默认是user呢,这个密码又是如何一步一步生成出来的呢,这一系列的过程是怎样的呢,带着这些疑问,今天Leo哥就跟大家一起学习其中奥妙。

3.默认用户生成

首先我们来讲讲这个默认用户生成,他具体是如何是怎么生成的,又具体存在哪里呢?我们接着往下看

还记得这个自动配置的imports嘛,在项目启动之后,SpringBoot就会自动导入一些我们需要的配置,我们这里主要看一下SecurityAutoConfiguration这个类。

image-20231205201549869

image-20231205201822196

如上图,在这个类中,他主要加载了一些配置类,比如SecurityProperties这个配置文件,让他在项目启动之前就生效。

我们接着点开这个配置文件进行查看,看看是否我们想找的配置信息。

image-20231205202014757

点开之后,果然发现了一个静态的User类,在这个User类中,有name和password属性,这不就是我们的默认用户信息嘛,默认用户名为user,默认密码为随机生成的UUID

4.表单认证流程

上面我们知道了默认用户是怎么一步一步加载生成的,那我们就接着往下走,既然知道了用户名跟密码,我们就使用SpringSecurity给我提供的表单进行登录认证,那这个登录又是如何一步一步进行认证的呢,我们接着看。

在之前的学习中,我们简单追踪了一下SpringBoot自动配置相关的内容,知道了SpringSecurity最终会在这里对我们的所有请求进行拦截,也就是我们所谓的认证,是通过http进行认证,当然认证是分好几种,有默认的httpBasic 以及 formLogin,而我们默认的那个表单登录页走的就是formLogin这个方法。

image-20231205201036604

他会调用 HttpSecurity 类的 formLogin() 方法,在该方法中创建 FormLoginConfigurer 类的实例,并指定处理认证的 Filter 进行认证:

image-20231205202326832

然后又去new了一个FormLoginConfigurer(),然后去调用父类的构造方法区new这个石磊

image-20231205202413310

在 UsernamePasswordAuthenticationFilter的 attemptAuthentication() 中,调用 AuthenticationManager 接口的 authenticate() 方法进行认证:

image-20231205202656359

我们点开AuthenticationManager,发现他是一个接口,于是我们点开他的实现类ProviderManager中的authenticate() 进行查看。

image-20231205203202060

又去调用了provider.authenticate(authentication)方法,我们接着点进去看,发现AuthenticationProvider又是一个接口,于是我们接着去查看他的实现类。

而他实际执行的是 AuthenticationProvider接口实现类AbstractUserDetailsAuthenticationProvider 中的 authenticate() 方法,在该方法中调用 retrieveUser() 方法:

image-20231205203406457

而实际执行的是 AbstractUserDetailsAuthenticationProvider 的子类 DaoAuthenticationProvider 中的 retrieveUser() 方法,在该方法中调用 UserDetailsService 接口的 loadUserByUsername() 方法:

image-20231205203624695

他实际执行的是 UserDetailsService 接口实现类 InMemoryUserDetailsManager 中的 loadUserByUsername() 方法,在该方法中会在 users 集合变量中根据用户输入的帐号获取 UserDetails 信息:

image-20231205203747758

这个users是什么呢,可以看出来是本来进行定义的,我们点过去看看本来的属性users

image-20231205203841857

可以看出来这个users就是从HashMap中取出来的,也就是基于内存保存的users。

类 InMemoryUserDetailsManager 是由内存 map 支持的接口实现类,基于内存存储,不需要后端数据库

image-20231205203938965

5.小结

  • 默认用户名 user 和 控制台的密码,是在 SpringSecurity 提供的 User 类中定义生成的。
  • 在表单认证时,基于 InMemoryUserDetailsManager 类具体进行实现,也就是基于内存的实现,当然我们后续进行拓展的话可以直接实现UserDetailsService接口,通过数据库进行用户实现。

6.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

公众号封面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1286676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(四) python门面模式

文章目录 4.1 结构型设计模式4.1.1 简介4.1.2 常见的几种结构型设计模式 4.2 理解门面设计模式4.2.1 门面设计模式概述4.2.2 门面设计模式的作用 4.3 UML类图4.3.1 门面4.3.2 系统4.3.3 客户端 4.4 门面模式的代码实现4.4.1 场景:4.4.2 python实现 4.5 原理&#xf…

【C++】动态内存管理——new和delete

这篇文章我们讲一下C的动态内存管理,从一个比较陌生的知识说起,我们知道,一个工程可以创建很多.c文件,我们如果定义一个全局变量,只要用extern声明一下,在每个文件都可以用。而用static修饰的全局变量只能在…

Vue Computed

小满,我的神! 视频链接 // 只读 const plusOne computed(() > count.value 1) // 可读可写 const plusOne computed({get: () > count.value 1,set: (val) > {count.value val - 1} }, { // 用于调试onTrack(e) {debugger},onTrigger(e) …

软件测试基础知识总结

之前有将基础的软件测试知识做了一个总结,但比较潦草,很多内容只是一笔带过,快到年底了,自己也有个写年终知识总结文档的计划,就将基础的理论知识重新整理一番。 有人问我,这些都是能搜索到的知识&#xf…

微信视频无法播放,快速进行格式转换方法

你是否遇到过这样的事情呢,朋友或者家人在电脑上用微信给你发的视频,在自己的微信上点开却无法播放。这种是什么原因造成的呢?是不是需要将这些无法播放的视频转换为微信支持的格式才行,那应该如何转换呢? 不要着急&a…

使用 PyWebCopy 在 Python 中克隆网页

更多资料获取 📚 个人网站:ipengtao.com PyWebCopy 是一个用于克隆网页内容的 Python 库,它允许用户从指定的 URL 复制整个网页并保存到本地。本文将介绍 PyWebCopy 的基本用法,以及如何克隆网页并保存网页内容到本地文件夹。 安…

QTableView用代码设置选中状态

背景: 个人笔记,欢迎探讨。 目的是实现用代码设置表格中的选中状态,比如选中某个单元格,或某行,某列。实际上只要能完成选中单元格,行和列都是单元格的集合,道理一样。 QTableWidget比QTable…

常用汇编指令集

寄存器 如上是OD展示的寄存器,逐条说明常用的寄存器和标志位含义: EIP:寄存器指向即将要执行的指令的地址(EIP中的地址,就是下一步要执行指令的地址) ESP:里面的内容永远指向堆栈的最顶端 EAX&…

青春挚爱-计算机

为什么选择计算机? 看到这个问题,不禁把镜头遥向十几年前的某个片刻。 一、梦想的种子 首先信仰技术是从小的梦想,比如科学家精神之启蒙,比如勇敢者探索之启蒙。 为什么课本中的科学家可以做到精忠报国,矢志不渝&…

Elasticsearch:什么是向量嵌入?

向量嵌入定义 向量嵌入 (vector embeddings) 是一种将单词、句子和其他数据转换为捕获其含义和关系的数字的方法。 它们将不同的数据类型表示为多维空间中的点,其中相似的数据点更紧密地聚集在一起。 这些数字表示可以帮助机器更有效地理解和处理这些数据。 单词和…

云原生的 CI/CD 框架tekton - Trigger(二)

上一篇为大家详细介绍了tekton - pipeline,由于里面涉及到的概念比较多,因此需要好好消化下。同样,今天在特别为大家分享下tekton - Trigger以及案例演示,希望可以给大家提供一种思路哈。 文章目录 1. Tekton Trigger2. 工作流程3…

【计算机系统基石与Linux进程管理深度解析】

​​​​​​​ 【本节重点】 认识冯诺依曼系统 操作系统概念与定位 深入理解进程概念,了解PCB 学习进程状态,学会创建进程,掌握僵尸进程和孤儿进程,及其形成原因和危害 1.冯诺依曼体系结构 我们常见的计算机,如…

App内存优化

一、内存优化介绍 1.背景介绍 内存是大问题但缺乏关注压实骆驼的最后一个稻草(堆栈溢出) 2.内存问题 内存抖动:锯齿状、GC导致卡顿内存泄露:可用内存减少、频繁GC内存溢出:OOM,程序异常 二、优化工具选…

【C语言】函数递归详解(二)

前言 在上一篇博客函数递归详解(一)中讲解了什么是递归,递归的思想及限制条件以及两个递归的例子,这一篇博客将讲解递归与迭代的关系。 递归与迭代 递归是一种很好的编程技巧,但是同很多技巧一样也是可能被误用的&…

api 网关

API网关 什么是网关? 微服务背景下,一个系统被拆分为多个服务,但是像安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现&#x…

2023年【T电梯修理】考试总结及T电梯修理证考试

题库来源:安全生产模拟考试一点通公众号小程序 T电梯修理考试总结考前必练!安全生产模拟考试一点通每个月更新T电梯修理证考试题目及答案!多做几遍,其实通过T电梯修理证考试很简单。 1、【多选题】《特种设备安全法》规定&#x…

【2】PyQt创建窗口

1. 第一个PyQt窗口 from PyQt5.QtWidgets import QApplication,QWidget import sys# 1.创建应用程序 app QApplication(sys.argv)# 2.创建窗口 w QWidget()# 3.显示窗口 w.show()# 4.等待窗口停止 sys.exit(app.exec()) 执行代码,就会显示PyQt窗口: 2. PyQt模块简介 PyQt中…

基于SpringBoot的校园互助网站

简介 本系统分为三个角色,分别是普通用户和管理员、以及超级管理员,主要的功能模块有注册、登录、物品代购、快递代取、话题管理、任务管理、反馈管理、投诉管理、订单管理等功能模块。 项目 数据库 首页 登录 新增反馈 发布话题 发布任务 接单 我要投诉…

粒子群优化算法的实践

粒子群优化算法的实践 flyfish 粒子群优化算法(Particle Swarm Optimization,PSO)或者粒子群算法 红叉的地方是理想之地,这些粒子都想去,总结8个字是信息共享,个人决策。 上完图之后,上代码&a…

算法通关村——数论问题

数论是一个很重要的学科,覆盖领域极广,小到小学的智力问题,大到世界顶级科学家都一直在研究相关问题,因此其难度跨度非常大。在程序设计里 ,也经常会出现数论的问题,但是,这些一般都是比较基本的…