Spring Security(maven项目) 3.0.2.9版本 --- 改
前言:
通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往复以至无穷,而实践和认识之每一循环的内容,都比较地进到了高一级的程度。
本期目标:
针对上一期的java配置进行修改,优化可读性,易上手程度
正片:
Spring Security Java配置
基于Security Filter Chain,我们对配置进行了分类
第一类:Security Filter配置(客体)
第二类:Security Filter Chain配置(主体)
基本结构
第一类配置模板:
@Configuration //用于标记一个类为配置类,表示该类包含Bean的定义。
@EnableWebSecurity //其中一个功能:注入SecurityFilterChain
public class WebSecurityConfig {//自定义Security Filter 配置......}
第二类配置模板:
public class SecurityWebApplicationInitializerextends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {// 注册Security Filter Chain// 话口号内公式:带有@EnableWebSecurity的类// 一般情况,一个配置可以完成全部功能return new Class[]{WebSecurityConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[0];}@Overrideprotected String[] getServletMappings() {return new String[0];}
}
注意:两段代码的类名不是同一个!侧面表示,不是同一个类

启动程序,运用对比
仅添加框架,无任何配置
基础配置,但未注册
无基础配置,但注册
基础配置并注册
统一内容,无须对比(官方提供的表单登录)

成功登录后

对比内容:
打印日志,登录用的账号密码
对比方式:对代码进行注释化,再启动
在正式对比前,先完善配置
package example.hello_security;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;@Configuration //用于标记一个类为配置类,表示该类包含Bean的定义。
@EnableWebSecurity //其中一个功能:注入SecurityFilterChain
public class WebSecurityConfig {//基本配置@Beanpublic UserDetailsService userDetailsService() {InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());return manager;}}
对比开始
第一轮对比:日志

无配置

有配置,无注册

无配置,有注册

有配置,有注册
通过对比,我们发现了日志中的差距,有配置的没有下面两句话
Using generated security password: e06ee57c-1f9b-4e23-ab3c-058b6a6f85fb
使用生成的安全密码:e06ee57c-1f9b-4e23-ab3c-058b6a6f85fb
This generated password is for development use only. Your security configuration must be updated before running your application in production.
此生成的密码仅供开发使用。在生产环境中运行应用程序之前,必须更新您的安全配置。
结论一:有配置的无生成的安全密码
结论二:无配置的有生成的安全密码
第二轮对比:登录
无配置的可以直接利用生成的安全密码,配合上默认用户user完成登录
因为有配置的没生成的安全密码,无法登录
结论一:无配置,可使用默认用户名和日志中生成的安全密码进行登录认证
结论二:有配置,目前无法进行登录
结论汇总:
结论一:有配置的无生成的安全密码
结论二:无配置的有生成的安全密码
结论三:无配置,可使用默认用户名和日志中生成的安全密码进行登录认证
结论四:有配置,目前无法进行登录
那有配置该怎么进行登录?
再认识,再总结
@Configuration //用于标记一个类为配置类,表示该类包含Bean的定义。
@EnableWebSecurity //其中一个功能:注入SecurityFilterChain
public class WebSecurityConfig {//基本配置@Beanpublic UserDetailsService userDetailsService() {InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());return manager;}}
作者看着源码,然后试着输入了一下,登录成功了!
username :user
password : password

我们修改user和密码试试

修改后的代码

我们去掉注册试试

启动!!!!

没区别
结论1:目前来说,还是不知道注册有啥用
结论2:我们可以通过修改InMemoryUserDetailsManager.createUser方法去自定义登录(前提:基于内存认证)
结合之前的汇总,再总结一次,修改
结论一:有配置的无生成的安全密码
结论二:无配置的有生成的安全密码
结论三:无配置,可使用默认用户名和日志中生成的安全密码进行登录认证
结论四:有配置,目前无法进行登录
结论五:目前来说,还是不知道注册有啥用
结论六:我们可以通过修改InMemoryUserDetailsManager.createUser方法去自定义登录(前提:基于内存认证)
结论一,结论二,结论三保持不变
结论四与结论六结合形成新的结论四:
有配置,可以使用InMemoryUserDetailsManager.createUser方法中的Username和password实参进行登录,也可以修改Username/password进行自定义登录
结论五不变
新结论如下:
结论一:有配置的无生成的安全密码
结论二:无配置的有生成的安全密码
结论三:无配置,可使用默认用户名和日志中生成的安全密码进行登录认证
结论四:有配置,可以使用InMemoryUserDetailsManager.createUser方法中的Username和password实参进行登录,也可以修改Username/password的实参进行自定义登录
结论五:目前来说,还是不知道注册有啥用
进一步认识,再总结
我们将对比,基本配置和默认配置,以及复习InMemoryUserDetailsManager达到进一步认识
@Configuration //用于标记一个类为配置类,表示该类包含Bean的定义。
@EnableWebSecurity //其中一个功能:注入SecurityFilterChain
public class WebSecurityConfig {//基本配置@Beanpublic UserDetailsService userDetailsService() {InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withDefaultPasswordEncoder().username("yanxinru").password("yanxinru233").roles("USER").build());return manager;}//默认配置@Bean@ConditionalOnMissingBean(UserDetailsService.class)InMemoryUserDetailsManager inMemoryUserDetailsManager() {String generatedPassword = "abcdefg123a48721";return new InMemoryUserDetailsManager(User.withUsername("user").password(generatedPassword).roles("ROLE_USER").build());}
}
首先,注释掉基础配置,尝试能否使用username和password里的参数进行登录
很显然无法启动程序
Error creating bean with name 'inMemoryUserDetailsManager' defined in class path resource [example/hello_security/WebSecurityConfig.class]: Failed to instantiate [org.springframework.security.provisioning.InMemoryUserDetailsManager]: Factory method 'inMemoryUserDetailsManager' threw exception with message: ROLE_USER cannot start with ROLE_ (it is automatically added)
创建在类路径资源 [example/hello_security/WebSecurityConfig.class] 中定义的名称为“inMemoryUserDetailsManager”的 Bean 时出错:无法实例化 [org.springframework.security.provisioning.InMemoryUserDetailsManager]:工厂方法“inMemoryUserDetailsManager”引发异常,并显示消息:ROLE_USER不能以 ROLE_ 开头(自动添加)
既然没办法启动,那就pass掉
那就直接进入到复习InMemoryUserDetailsManager阶段
原本想通过对比,引出InMemoryUserDetailsManager它,既然启动不了,那就不对比了,直接进入主题
InMemoryUserDetailsManager有两个功能(目前了解的)
第一个功能:对内存认证提供支持
第二个功能:管理userDetail
在刚刚的体验中,内存这一概念,恐怕不是平常定义的内存(内存大小),而是表单,不,通过体验得到是代码
@Beanpublic UserDetailsService userDetailsService() {InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withDefaultPasswordEncoder().username("yanxinru").password("yanxinru233").roles("USER").build());return manager;}
虽然说,代码是存储在内存中的,这也是一种说法,实际体验而言,这个内存特指这段代码,并且通过表单去验证
注意:作者对表单的定义,承载账号密码的载体
打开它的源码

它的形参来源于UserDetails

的实现

我们在基础配置中只使用了三个
回到基础配置使用的方法

通过if的结果,我们可以知道它的作用是什么,存放user,存放我们的基本配置
支持,这两个是用的真神!
内存认证通过支持,什么支持?载体支持,认证不归它管,它还有一个管理UserDetails功能,也是原因这个
总结:InMemoryUserDetailsManager的作用是提供存储用户信息的载体,目前不负责认证
汇总:
结论一:有配置的无生成的安全密码
结论二:无配置的有生成的安全密码
结论三:无配置,可使用默认用户名和日志中生成的安全密码进行登录认证
结论四:有配置,可以使用InMemoryUserDetailsManager.createUser方法中的Username和password实参进行登录,也可以修改Username/password的实参进行自定义登录
结论五:目前来说,还是不知道注册有啥用
结论六:InMemoryUserDetailsManager存放user,存放我们的基本配置
结论七:内存非内存,而是用于验证的载体,表单
相关文章:
Spring Security(maven项目) 3.0.2.9版本 --- 改
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
并发编程中的常见问题
1 竞态条件 (Race Condition) 定义:竞态条件是指多个线程在访问共享资源时,由于执行顺序的不同导致结果不确定的情况。 示例: public class Counter {private int count = 0;public void increment() {count++;}public int getCount() {return count;} }在多线程环境下,…...
二维前缀和:高效求解矩阵区域和问题
在处理二维矩阵时,频繁计算某一子矩阵的和是一个常见的操作。传统的做法是直接遍历该子矩阵,时间复杂度较高。当矩阵非常大且有大量的查询时,直接计算将变得低效。为了提高效率,我们可以通过 二维前缀和 技巧在常数时间内解决这个…...
鸢尾花书《编程不难》02---学习书本里面的三个案例
文章目录 1.引言2.第一个例子---模拟硬币的投掷结果3.第二个例子---混合两个一元高斯分布的随机数4.第三个例子---线性回归的作图5.关于书中的问题的解决方案 1.引言 今天的这个文章主要是阅读学习鸢尾花书系列的第一本《编程不难》,今天主要是记录下书里面的两个例…...
MySQL(高级特性篇) 13 章——事务基础知识
一、数据库事务概述 事务是数据库区别于文件系统的重要特性之一 (1)存储引擎支持情况 SHOW ENGINES命令来查看当前MySQL支持的存储引擎都有哪些,以及这些存储引擎是否支持事务能看出在MySQL中,只有InnoDB是支持事务的 &#x…...
CSS Display属性完全指南
CSS Display属性完全指南 引言核心概念常用display值详解1. block(块级元素)2. inline(行内元素)3. inline-block(行内块级元素)4. flex(弹性布局)5. grid(网格布局&…...
【机器学习篇】K-Means 算法详解:从理论到实践的全面解析
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)
IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)(JetBrains家的其他IDE应该也支持) 之前看到宇宙第一IDE VS Code好像默认代理了远程的端口,但是一直没找到IDEA的同类功能,这次终于发现了 以Intell…...
内核定时器3-用户空间定时器
用户空间定时器与内核定时器的关系 虽然用户空间定时器和内核定时器在实现上各自独立,但用户空间定时器通常依赖于内核定时器提供的基础设施。以下是具体关系: 依赖性 用户空间定时器的实现基于内核定时器。 例如,POSIX 定时器使用内核的 h…...
C++ 字面量深度解析:从基础到实战进阶
在 C 开发中,字面量(Literal)不仅是基础语法的一部分,更是提升代码可读性、安全性和性能的关键工具。本文将深入探讨 C 字面量的高级特性、最新标准支持(C11/14/17/20)以及实际开发中的应用技巧,…...
论文paper(更新...)
目录 是否rebuttal?rebuttal 技巧 是否rebuttal? 如果不rebuttal 肯定会拒稿,编辑也会给审稿人发信息,如下: Comment: Thanks for your efforts in reviewing this paper. The authors have neither submitted a rebu…...
变形金刚多元宇宙
1 涉及的公司 1.1 孩之宝HasBro 孩之宝与Takara签订协议后,孩之宝开始使用Takara的专利进行研发。 1.2 日本特佳丽Takara公司 特佳丽Takara Diaclone可变形恐龙的机器人玩具 Microman可变形汽车的机器人玩具 1.3 日本东映TOEI ANIMTION 1.4 美国漫威 为了推广玩具…...
HTTP协议的无状态和无连接
无连接 ①无连接的含义 这里所说的无连接并不是指不连接,客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考…...
ASP.NET代码审计 SQL注入篇(简单记录)
sql注入,全局搜索 Request QueryString ToString() select select * aspx是设计页面,而aspx.cs是类页面,也就是说设计页面用到的类信息在这个页面里面,其实就是把设计和实现分离开来。 源码 using System; using System.Collect…...
毫秒级响应的VoIP中的系统组合推荐
在高并发、低延迟、毫秒级响应的 VoIP 场景中,选择合适的操作系统组合至关重要。以下是针对 Ubuntu linux-lowlatency、CentOS Stream kernel-rt 和 Debian 自定义 PREEMPT_RT 的详细对比及推荐: 1. 系统组合对比 特性Ubuntu linux-lowlatencyCentO…...
w186格障碍诊断系统spring boot设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
shell -c
个人博客地址:shell -c | 一张假钞的真实世界 shell -c {string}:表示命令从-c后的字符串读取。在需要使用管道或者重定向需要sudo时很有用,如下: $ sudo find ../*/exportFiles -mtime 15 -name "*" | xargs -I {} r…...
(笔记+作业)书生大模型实战营春节卷王班---L1G3000 浦语提示词工程实践
学员闯关手册:https://aicarrier.feishu.cn/wiki/QtJnweAW1iFl8LkoMKGcsUS9nld 课程视频:https://www.bilibili.com/video/BV13U1VYmEUr/ 课程文档:https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/Python 关卡作业:htt…...
文献学习笔记:中风醒脑液(FYTF-919)临床试验解读:有效还是无效?
【中风醒脑液(FYTF-919)临床试验解读:有效还是无效?】 在发表于 The Lancet (2024 年 11 月 30 日,第 404 卷)的临床研究《Traditional Chinese medicine FYTF-919 (Zhongfeng Xingnao oral pr…...
Chapter2 Amplifiers, Source followers Cascodes
Chapter2 Amplifiers, Source followers & Cascodes MOS单管根据输入输出, 可分为CS放大器, source follower和cascode 三种结构. Single-transistor amplifiers 这一章学习模拟电路基本单元-单管放大器 单管运放由Common-Source加上DC电流源组成. Avgm*Rds, gm和rds和…...
FlowState Lab与SpringBoot集成:构建企业级波动分析微服务
FlowState Lab与SpringBoot集成:构建企业级波动分析微服务 1. 引言:当AI预测遇上微服务架构 电商大促期间的服务器负载波动、金融交易中的异常流量监测、物流系统的季节性需求变化...这些业务场景都需要对时序数据进行实时分析和预测。传统单机版的分析…...
mPLUG视觉问答效果展示:交通标志识别、菜单文字理解、图表数据问答
mPLUG视觉问答效果展示:交通标志识别、菜单文字理解、图表数据问答 获取更多AI镜像 想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,…...
英语从句全攻略:名词性、定语、副词性从句一网打尽(含易错点分析)
英语从句全攻略:名词性、定语、副词性从句一网打尽(含易错点分析) 当你读到一篇地道的英文文章时,是否曾被那些"套中套"的句子结构难住?从句就像英语语法中的俄罗斯套娃,层层嵌套却暗藏规律。作为…...
Phi-3-mini-128k-instruct低资源部署效果:4GB显存流畅运行实测
Phi-3-mini-128k-instruct低资源部署效果:4GB显存流畅运行实测 最近在折腾一些边缘设备上的AI应用,发现一个挺有意思的现象:很多开发者手头只有一些“古董级”的显卡,比如GTX 1650或者移动端的MX系列,显存也就4GB左右…...
GORM实战避坑指南:从‘小白’到‘老鸟’必须知道的10个细节(含MySQL连接配置)
GORM实战避坑指南:从‘小白’到‘老鸟’必须知道的10个细节(含MySQL连接配置) 1. MySQL连接配置的隐藏陷阱 charsetutf8mb4的必要性 MySQL默认的utf8编码只支持最多3字节的字符,而emoji表情等特殊字符需要4字节存储。若不指定utf8…...
YimMenu终极指南:5大核心功能打造安全的GTA5增强体验
YimMenu终极指南:5大核心功能打造安全的GTA5增强体验 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMe…...
BlackArch Linux 完全指南:渗透测试专家的终极武器库
BlackArch Linux 完全指南:渗透测试专家的终极武器库 【免费下载链接】blackarch An ArchLinux based distribution for penetration testers and security researchers. 项目地址: https://gitcode.com/gh_mirrors/bl/blackarch BlackArch Linux 是基于 Arc…...
【20年JVM老兵亲测】Java 25密封类+模式匹配+记录类三重协同时,API设计效率提升47%!
第一章:Java 25密封类扩展特性的演进脉络与设计哲学Java 密封类(Sealed Classes)自 Java 15 作为预览特性引入,历经 Java 16、17 的持续迭代,最终在 Java 17 成为正式特性。而 Java 25 进一步拓展其能力边界࿰…...
Maven项目实战:用Apache PDFBox 2.0.27实现PDF批量转PNG(附完整代码)
Maven项目实战:用Apache PDFBox 2.0.27实现PDF批量转PNG(附完整代码) 在Java开发者的日常工作中,PDF文档处理是一个高频需求场景。无论是电子合同归档、报表生成还是文档预览,将PDF转换为图片都是刚需功能。Apache PDF…...
通过爱毕业AI的智能改写功能,五个方法助你快速降低论文重复率
嘿,大家好!我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题:论文重复率飙到30%以上怎么办?别慌,我这就分享5个实用降重技巧,帮你一次搞定,轻松压到合格线以下。这些方法都是我亲身试验过的&a…...
