Spring Security3.0.2版本

前言:

通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往复以至无穷,而实践和认识之每一循环的内容,都比较地进到了高一级的程度。

 

前两期(温故):

Spring Security3.0版本_spring security 3-CSDN博客

Spring Security3.0.1版本-CSDN博客

知新

正片:

在之前的文章,我们发现了一个问题,以理论去指导实践(非自己的理论)是很容易出现bug的​​​​​​​

先设计一个环境:

使用SpringBoot Security,用户通过表单进行登陆,校验数据库账号密码

在使用SpringBoot Security框架时,它默认启动了十分多的Security Filter,其中就包括了框架提供的账号密码登录,我们只需要用自己的账号密码进行登录就要修改Security Filter关于账号密码登录的设置

实践开始:

如何修改默认的Security Filter,就需要使用到Security Filter自定义模板

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.csrf(Customizer.withDefaults()).authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated()).httpBasic(Customizer.withDefaults()).formLogin(Customizer.withDefaults());return http.build();}}

复制该内容,粘贴至代码内,如果你看了前两期,你就知道csrf,AuthorizeHttpRequests等http.后面的内容是什么,是一个个Security Filter

Q问:官方做了几个自定义Security Filter

A答:csrf,AuthorizeHttpRequests,HTTP basic,form Login四个自定义Security filter

现在的新的问题出现了,如何找到管理认证登录的Security filter

(点开认证,我们看到了官方提供的一系列内容,其中用户名密码认证登录就是我们需要的)

(读取用户名OR密码,很接近了)

(又分类了,但是我们知道我们的需要,表单)

找到了,如何自定义认证登录

formLogin方法

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain (HttpSecurity http) throws Exception {//自定义认证http.formLogin(element -> element.loginPage("/login")).build();return null;}
}

将login修改为auth登录再看看Security提供的登录页面还能不能登录

会自动转入,好吧不管怎么搞都会跳转到该页面,这条路失败

但是我再重看的时候,发现少写了一句代码

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain (HttpSecurity http) throws Exception {//自定义认证http.formLogin(element ->element.loginPage("/auth").permitAll()//少写代码).build();return null;}
}

再次运行

Unsatisfied dependency expressed through method 'setFilterChains' parameter 0: Error creating bean with name 'filterChain' defined in class path resource [author/chen/config/SecurityConfig.class]: Failed to instantiate [org.springframework.security.web.SecurityFilterChain]: Factory method 'filterChain' threw exception with message: permitAll only works with either HttpSecurity.authorizeRequests() or HttpSecurity.authorizeHttpRequests(). Please define one or the other but not both.

报错了,先翻译一下

通过方法 'setFilterChains' 参数 0 表示的不满意的依赖关系:创建在类路径资源中定义的名称为 'filterChain' 的 Bean 时出错 [author/chen/config/SecurityConfig.class]:实例化失败 [org.springframework.security.web.SecurityFilterChain]:工厂方法 'filterChain' 引发异常,并显示消息:permitAll 仅适用于 HttpSecurity.authorizeRequests() 或 HttpSecurity.authorizeHttpRequests()。请定义一个或另一个,但不能同时定义两者。

我懂了,原因是那个多写的代码所以诱导的bug,换句话说permitALL只用于 HttpSecurity.authorizeRequests() 或 HttpSecurity.authorizeHttpRequests()

问题解决了,但是核心问题并没有解决——自定义认证登录

我找到了Security用例,然后看到了登录这两个字,我就顺手点进去看了

看起来,这篇文章涉及到了以下四部分,看下去,貌似无关,然后又换了一个关键词——配置

这不就是我们需要的内容吗!

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.authentication.builders.*;
import org.springframework.security.config.annotation.web.configuration.*;@Configuration
@EnableWebSecurity
public class WebSecurityConfig {@Beanpublic UserDetailsService userDetailsService() {InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());return manager;}
}

没报错,没有引入,说明什么?

CTRL + 鼠标左键 User,我们可以看到

它是security的内部代码

它实现了userDetails接口

看不懂!

放弃,看看对比

共同点:

第一点:实例化InMemoryUserDetailsManager这个类,并调用对象方法createUser

第二点:调用User类,中的withDefaultPasswordEncoder,username,password,roles,build方法

Q:第二张图片就是User

A:其实这就是User的调用,第一张图是将它变成变量去使用

问:是不是只要将User.方法的内容修改为我们数据库的内容就成功了?

我们参考第一张图片,给固定数值,尝试登录看看

我们把密码修改为123456789,启动!

我以为是版本问题,结果看到了这句话,

User.withDefaultPasswordEncoder() is considered unsafe for production and is only intended for sample applications

User.withDefaultPasswordEncoder() 被认为对生产不安全,仅用于示例应用程序

那官方整这一出....

再看源码时

尝试直接调用这个

在直接调用这两个方法时

The method getUsername() in the type User is not applicable for the arguments (String)Java(67108979)

User 类型的方法 getUsername() 不适用于参数 (String)Java(67108979)

我突然发现,这个是对象函数,没办法直接调用。。。。。。。这个不是它的问题是作者的问题

在构建对象时,又发现了

它没有无参数构造函数,需要加入一堆值

然后我根据我的经验,那就是build这个单词在Spring生态里十分的有用,一般在构造开始,或者结束都会加一个

还是报错了

然后在随便点点,点到了这里

还是有withDefault这个方法

找到了通Hello Web Security Java名字一样的代码

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig {final String PASSWORD = "123456789";@Beanpublic UserDetailsService userDetailsService(){UserDetails user = User.withDefaultPasswordEncoder().username("null").password("").build();return new InMemoryUserDetailsManager(user);}
}

还是报错了

总结:

启动了以UserDetailsService类为后续答案为目标,以上实践均为失败

第一点:使用Security filter进行配置,login方法失败,其中permitAll()会产生报错,原因只适用HttpSecurity.authorizeRequests() 或 HttpSecurity.authorizeHttpRequests()方法

第二点:我们找到新实例有两个共同点

        第一点:实例化InMemoryUserDetailsManager这个类,并调用对象方法createUser

        第二点:调用User类,中的withDefaultPasswordEncoder,username,password,roles,build方法

第三点(基于第二点的实践总结):无法通过添加参数去做到登录

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

--spring.profiles.active=prod

rootproduct-qualification:~# ps -ef | grep java root 5110 1 3 16:57 ? 00:00:54 java -jar productQualification.jar --spring.profiles.activeprod root 6476 5797 0 17:26 pts/0 00:00:00 grep --colorauto java好的,你使用 ps …

力扣矩阵-算法模版总结

lc-73.矩阵置零-(时隔14天)-12.27 思路:(23min22s) 1.直接遍历遇0将行列设0肯定不行,会影响后续判断,题目又要求原地算法,那么进一步考虑是否可以将元素为0,其行列需要设为0的位置给存储下来,最后再遍历根据…

Markov test笔记

补充知识 来源于数学之美第五章: 到了 19 世纪,概率论的发展从相对静止的随机变量的研究发展到随机变量的时间序列 ( s 1 , s 2 , s 3 , … ) (s_1, s_2, s_3, \dots) (s1​,s2​,s3​,…),即随机过程(动态的)。这在…

DeepSpeed 使用 LoRA 训练后文件结构详解

DeepSpeed 使用 LoRA 训练后文件结构详解 在大语言模型(LLM)的训练过程中,DeepSpeed 提供了强大的分布式训练能力,而 LoRA(Low-Rank Adaptation)通过参数高效微调技术显著减少了资源占用。完成训练后&…

GitHub 桌面版配置 |可视化界面进行上传到远程仓库 | gitLab 配置【把密码存在本地服务器】

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 桌面版安装包下载clone 仓库操作如下GitLab 配置不再重复输入账户和密码的两个方…

docker-开源nocodb,使用已有数据库

使用已有数据库 创建本地数据库 数据库:nocodb 用户:nocodb 密码:xxxxxx修改docker-compose.yml 默认网关的 IP 地址是 172.17.0.1(适用于 bridge 网络模式)version: "2.1" services:nocodb:environment:…

uniapp 前端解决精度丢失的问题 (后端返回分布式id)

原因: 后端使用分布式id, id为19位数,导致精度丢失 ,前端解决方法 这个是通过浏览器请求回来的数据,这个时候id 数据已经丢失了,在数据库查询不到,在调获详情接口的时候会有问题 实际的: 解决…

SQL-leetcode-180. 连续出现的数字

180. 连续出现的数字 表:Logs -------------------- | Column Name | Type | -------------------- | id | int | | num | varchar | -------------------- 在 SQL 中,id 是该表的主键。 id 是一个自增列。 找出所有至少连续出现三次的数字。 返回的…

【教程】通过Docker运行AnythingLLM

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 官方教程:Local Docker Installation ~ AnythingLLM 1、先创建一个目录用于保存anythingllm的持久化文件: sudo mkdir /app su…

soular使用教程

用 soular 配置你的组织,工作更高效!以下是快速上手的简单步骤:  1. 账号管理 可以对账号信息进行多方面管理,包括分配不同的部门、用户组等,从而确保账号权限和职责的清晰分配。  1.1 用…

Github - 如何提交一个带有“verified”标识的commit

Github - 如何提交一个带有“verified”标识的commit 前言(Why) 今天在Github上浏览某项目的commit记录的时候发现,有的commit记录带有verified绿色标识,有的带有橘色的Unverified标识,还有的什么都不显示。 既然我是根正苗红的作者(bushi)…

基于Bregman的交替方向乘子法

目录标题 ADMM方法简介Bregman散度Bregman ADMM的原理主要优势代码示例:各个符号的解释:**梯度的几何含义**:具体数学公式:**应用示例**:**ADMM的标准形式:****ADMM中的变量角色:****ADMM中的更…

【操作系统】课程 3进程同步与通信 同步测练 章节测验

3.1知识点导图 无 3.2进程同步与互斥 【本章学习目标】 (1)了解进程通信的机制和通信方式。 (2)理解多道程序环境下进程间通信的机制;消息传递系统的实现。 (3)掌握临界资源和临界区的概念…

React中最优雅的异步请求

给大家分享在React19中使用useSuspense处理异步请求为什么是被认为最优雅的解决方案 一. 传统方案 解决异步请求的方案中,我们要处理至少两个最基本的逻辑 正常的数据显示数据加载的UI状态 例如: export default function Index(){const [content, …

《机器视觉:开启智能新时代》

《机器视觉:开启智能新时代》 一、机器视觉:工业之眼的崛起二、核心组件:构建精准视觉系统(一)光源:照亮视界的画笔(二)镜头:聚焦精准的慧眼(三)相…

STM32F103RCT6学习之四:定时器

1.基础 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、…

3DMAX镂空星花球建模插件FloralStarBall使用方法

3DMAX镂空星花球建模插件FloralStarBall使用教程 就是那个3DMAX镂空星花球建模,再也不用手动做了,使用3DMAX镂空星花球建模FloralStarBall插件可以一键生成! 3DMAX镂空星花球建模插件FloralStarBall,经典星形球体的美丽变体。星形…

Nginx区分PC端和移动端访问

在使用Nginx时,可以通过$http_user_agent变量来判断用户访问的客户端类型,从而提供不同的内容或服务。下面是一个基于$http_user_agent变量来判断是否为PC访问的Nginx配置示例。 1. 理解$http_user_agent变量的含义及其在Nginx中的用途 $http_user_agen…

Jmeter快速入门

目录 1.安装Jmeter 1.1.下载 1.2.解压 1.3.运行 2.快速入门 2.1.设置中文语言 2.2.基本用法 1.安装Jmeter Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量。 1.1.下载 可以Apache Jmeter官网下载,地址…

Ftrans数据摆渡系统 搭建安全便捷跨网文件传输通道

一、专业数据摆渡系统对企业的意义 专业的数据摆渡系统对企业具有重要意义,主要体现在以下几个方面‌: 1、‌数据安全性‌:数据摆渡系统通过加密传输、访问控制和审计日志等功能,确保数据在传输和存储过程中的安全性。 2、‌高…