springsecurity(学习自用)

springsecurity

学习资源:
https://blog.csdn.net/qq_45525848/article/details/131142179

  • springboot
  • spring security
    • 认证: 判断用户是否是系统合法用户过程
    • 授权: 判断系统内用户可以访问或具有访问那些资源权限过程

创建一个springboot项目

  • 如果只创建一个controller,不导入springsecurity的依赖,通过localhost:8080/页面就可以访问了。
  • 如果导入springsecurity依赖,那么访问页面时会自动跳转到登录页面,默认登录名为user,密码为控制台自动生成打印的密码。
为什么只导入依赖就可以有登陆页面,并拦截所有的页面转到登陆页面?

默认情况下Spring Boot 在对 Spring Security 进入自动化配置时,会创建一个名为 SpringSecurityFilerChain 的过滤器,并注入到 Spring 容器中,这个过滤器将负责所有的安全管理,包括用户认证、授权、重定向到登录页面等。

SpringBootWebSecurityConfiguration这个类是 spring boot 自动配置类,通过这个源码得知,默认情况下对所有请求进行权限控制:

@Configuration(proxyBeanMethods = false)
@ConditionalOnDefaultWebSecurity
@ConditionalOnWebApplication(type = Type.SERVLET)
class SpringBootWebSecurityConfiguration {@Bean@Order(SecurityProperties.BASIC_AUTH_ORDER)SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();return http.build();}
}
这就是为什么在引入 Spring Security 中没有任何配置情况下,请求会被拦截的原因!
  • 条件一 classpath中存在 SecurityFilterChain.class, HttpSecurity.class
  • 条件二 没有自定义 WebSecurityConfigurerAdapter.class, SecurityFilterChain.class
    默认情况下,条件都是满足的。
  • WebSecurityConfigurerAdapter 这个类极其重要,Spring Security 核心配置都在这个类中。
  • 如果要对 Spring Security 进行自定义配置,就要自定义这个类实例,通过覆盖类中方法达到修改默认配置的目的。
访问页面时自动跳转登录页面的实现流程:
  1. 比如请求/hello接口,在引入spring security依赖之后就会经过一些过滤器intercepter
  2. 当请求到达FilterSecurityInterceptor时,发现请求没有被认证就会拦截下来,并抛出AccessDeniedException异常
  3. 抛出这个异常就会被ExceptionTranslationFilter捕获,在这个拦截器中会调用LoginUrlAuthenticationEntryPoint#commence方法,给客户端返回302,并要求客户端重定向到登录页面
  4. 客户端就会发送登录请求/login
  5. 请求/login会被DefaultLoginPageGeneratingFilter拦截下来,并在拦截器中返回生成登录页面

就是通过这种方式,Spring Security 默认过滤器中生成了登录页面,并返回。

生成默认用户

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

满足以下两个条件:

  1. 从自动配置源码中得知当 classpath 下存在 AuthenticationManager 类
  2. 当前项目中,系统没有提供 AuthenticationManager.class、 AuthenticationProvider.class、UserDetailsService.class、AuthenticationManagerResolver.class、实例

默认情况下都会满足,此时Spring Security会提供一个 InMemoryUserDetailManager 实例

这就是默认生成 user 以及 uuid 密码过程! 另外看明白源码之后,就知道只要在配置文件中加入如下配置可以对内存中用户和密码进行覆盖。

spring.security.user.name=root
spring.security.user.password=root
spring.security.user.roles=admin,users

记:

  • WebSecurityConfigurerAdapter 扩展 Spring Security 所有默认配置
  • UserDetailService 用来修改默认认证的数据源信息
自定义认证
自定义资源权限规则
@Configuration
@EnableWebSecurity
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception{http.authorizeRequests() // 配置请求的访问控制.antMatchers("/index").permitAll() // /index路径允许所有用户访问(包括未认证的用户).antMatchers("/admin").hasRole("admin") // /admin路径只允许具有admin角色的用户访问.anyRequest().authenticated() // 所有其他请求都需要身份验证.and() // 用于连接其他配置部分.formLogin() // 启用默认的表单登录.loginPage("/login") // 可选:自定义登录页面URL.permitAll().and().rememberMe() // 启用记住我功能.key("uniqueAndSecret"); // 设置一个唯一且秘密的键,用于生成“记住我”cookie}
}

注意!配置项的先后顺序很重要

以下是几个常见配置项及其顺序的影响:

  1. antMatchers()的顺序:
  • Spring Security会按照配置顺序检查antMatchers(),并应用第一个匹配的规则。因此,特定路径的规则应放在更通用规则之前。

    例如,特定的路径如/admin应该在更通用的路径/**之前配置。

  1. authorizeRequests()与formLogin()和logout()的顺序:
  • 通常,你会先配置authorizeRequests(),因为这是定义哪些请求需要认证的地方。
  • formLogin()和logout()通常放在最后,因为这些是处理身份验证和注销的配置。

为什么顺序重要

  • 匹配顺序:Spring Security按照配置顺序检查每个请求,并应用第一个匹配的规则。如果通用路径配置在特定路径配置之前,会导致特定路径配置失效。
    例如,如果你将antMatchers(“/**”).authenticated()放在antMatchers(“/admin”).hasRole(“admin”)之前,那么/admin路径将匹配到通用的authenticated()规则,而不是hasRole(“admin”)规则。
  • 覆盖关系:更具体的规则应该在前面,这样它们不会被更通用的规则覆盖。

实践中的顺序

  1. 特定路径规则:总是放在最前面。
    例如,antMatchers(“/admin”).hasRole(“admin”)。
  2. 公开路径规则:放在中间。
    例如,antMatchers(“/public/**”).permitAll()。
  3. 通用路径规则:放在最后。
    例如,antMatchers(“/**”).authenticated()。
  4. 其他功能配置:如formLogin()和logout()等配置通常放在路径规则之后。

配置项详细说明:

  1. antMatchers(“/admin”).hasRole(“admin”):
  • 这一行配置了/admin路径需要具有admin角色的用户才能访问。
  • 由于这是一个特定路径,放在配置的最前面。
  1. antMatchers(“/public/**”).permitAll():
  • 这一行配置了所有/public路径下的资源都允许所有用户访问,不需要任何认证。
  • 由于这是一个较具体的公开路径,放在第二。
  1. antMatchers(“/**”).authenticated():
  • 这一行配置了所有其他路径都需要认证(登录)才能访问。
  • 这是一个通用的路径配置,放在最后确保所有未明确配置的路径都需要认证。
  1. formLogin():
  • 配置了表单登录,包括自定义登录页面。
  • permitAll()允许所有用户访问登录页面,即使是未认证用户。
  1. logout():
  • 配置了注销功能,并允许所有用户访问注销URL。
  1. .loginProcessingUrl(“/doLogin”):
  • 配置用于指定处理登录请求的URL。当用户提交登录表单时,表单的action属性应该指向这个URL。
  • Spring Security将拦截这个URL的请求,处理用户提交的凭证(用户名和密码),并进行身份验证。

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

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

相关文章

IEC62056标准体系简介-2.IEC62056标准体系及对象标识系统(OBIS)

1. IEC 62056标准体系 IEC 62056标准体系目前共包括六部分,见图1: 第61部分:对象标识系统第62部分:接口类第53部分:COSEM应用层第46部分:使用HDLC(High Level Data Link Control)协…

Linux多进程和多线程(八)多线程

多线程 线程定义线程与进程线程资源 线程相关命令 pidstat 命令 top 命令ps 命令常见的并发方案 1. 多进程模式2. 多线程模式 创建线程 1. pthread_create() 示例:创建一个线程 2. pthread_exit() 退出线程3. pthread_join() 等待线程结束 示例: 线程分离 创建多个线程 示例 1:…

前端面试题35(在iOS和Android平台上,实现WebSocket协议有哪些常见的库或框架?)

在iOS和Android平台上,实现WebSocket协议有许多成熟且被广泛使用的库和框架。下面是一些推荐的选项: iOS 平台 SocketRocket 简介:这是由Facebook开源的库,专门为iOS和Mac OS X设计,提供WebSocket连接的功能。它基于S…

Blender新手入门笔记收容所(一)

基础篇 基础操作 视角的控制 控制观察视角:鼠标中键平移视图:Shift鼠标中键缩放视图:滚动鼠标中键滚轮 选中物体后:移动物体快捷键G,移动后单击鼠标就会定下来。 进入移动状态后:按Y会沿着Y轴移动进入移动…

LY/T 3359-2023 耐化学腐蚀高压装饰层积板检测

耐化学腐蚀高压装饰层积板是指用酚醛树脂浸渍的层状植物纤维材料为基材,与涂布以丙烯酸树脂为主体的装饰纸的饰面层,在高温高压下层积压制而成的具有化学腐蚀功能的高压装饰层积板。 LY/T 3359-2023 耐化学腐蚀高压装饰层积板检测项目: 测试…

HW期间——应急响应

01HW中应急响应的流程 001应急响应所处位置(应急处置组) 监控研判组发现的一些安全时间提供给应急处置组,应急处置组通过上机取证把线索给到溯源反制组。但是溯源反制组可能已经没有了,有些单位有,有些单位取消了。有…

Python神经模型评估微分方程图算法

🎯要点 🎯神经网络映射关联图 | 🎯执行时间分析 | 🎯神经网络结构降维 | 🎯量化图结构边作用 | 🎯数学评估算法实现 🍪语言内容分比 🍇Python随机梯度下降算法 随机梯度下降是梯度…

matlab仿真 通信信号和系统分析(下)

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第三章内容,有兴趣的读者请阅读原书) 一、离散傅里叶变换 clear all n0:30;%信号的时间范围 xsin(0.2*n).*exp(-0.1*n); k0:30;%频率范围 N31; Wnkexp(-j*2*pi/N).…

解决本地操作云服务器上的Redis

方案一:开放Redis默认端口,本地通过公网IP端口号的形式访问。 方案二:每次将本地编写好的Java代码打包,放在云服务器上运行。 方案三:配置ssh端口转发,把云服务器的redis端口,映射到本地主机。 …

【大模型】微调实战—使用 ORPO 微调 Llama 3

ORPO 是一种新颖微调(fine-tuning)技术,它将传统的监督微调(supervised fine-tuning)和偏好对齐(preference alignment)阶段合并为一个过程。这减少了训练所需的计算资源和时间。此外&#xff0…

使用微pe装系统

本文仅作为记录,不作为教程。 今天心血来潮想下点游戏玩玩,一看之前分的200gc盘已经红了,再加上大学之后这个笔记本已经用得很少了,于是打算重装电脑。 参考: 微PE辅助安装_哔哩哔哩_bilibil… 1.下载微pe和win10系统到U盘 我这…

Xilinx zc706 USB电路解析

作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 USB OTG检测原理 USB3320 USB_ID为低电平时候,为host模式,USB_ID为悬空(高…

python-23-零基础自学python open()和replace()函数运用

学习内容:《python编程:从入门到实践》第二版练习10-2 知识点: 打开文件,replace()替换文件内容,open(), 练习内容: 练习10-2:C语言学习笔记 可使用方法replace()将字符串中的特定单词都替换为另一个单…

云计算环境下的等级保护测评

概述 云计算环境下的等级保护测评是一个涵盖多个层面的综合性评估活动,它不仅包括了传统的信息系统安全等级保护测评内容,还需要考虑到云计算特有的安全特性和挑战。随着云计算技术的迅猛发展和广泛应用,其在政务、金融、教育等行业中的角色日…

代码随想录训练营第三十一天 56合并区间 738单调递增的数字

第一题: 原题链接:56. 合并区间 - 力扣(LeetCode) 思路:首先还是排序; 然后定义一个二维数组存放结果,先将第一个元素存放到结果数组中,然后从第一个元素开始遍历整个数组。 当前…

kafka系列之offset超强总结及消费后不提交offset情况的分析总结

概述 每当我们调用Kafka的poll()方法或者使用Spring的KafkaListener(其实底层也是poll()方法)注解消费Kafka消息时,它都会返回之前被写入Kafka的记录,即我们组中的消费者还没有读过的记录。 这意味着我们有一种方法可以跟踪该组消费者读取过的记录。 如前…

6.824/6.5840 的Debugging by Pretty Printing配置

TA的原文在:Debugging by Pretty Printing (josejg.com) 为了在WSL2中配置好打印运行日志,我可是忙活了一下午。可恶的log配置 首先是安装rich库Textualize/rich: Rich is a Python library for rich text and beautiful formatting in the terminal. …

用于视频生成的扩散模型

学习自https://lilianweng.github.io/posts/2024-04-12-diffusion-video/ 文章目录 3D UNet和DiTVDMImagen VideoSora 调整图像模型生成视频Make-A-Video(对视频数据微调)Tune-A-VideoGen-1视频 LDMSVD稳定视频扩散 免训练Text2Video-ZeroControlVideo 参…

需求分析|泳道图 ProcessOn教学

文章目录 1.为什么使用泳道图2.具体例子一、如何绘制确定好泳道中枢的角色在中央基于事实来绘制过程不要纠结美观先画主干处理流程再画分支处理流程一个图表达不完,切分子流程过程数不超25 ,A4纸的幅面处理过程过程用动词短语最后美化并加上序号酌情加上…

leetcode hot 100 刷题记录

题目300:最长递增子序列(NO) 解题思路:动态规划,就是dp[i]的运用,这里dp[i]表示第i个元素为结尾的最长子序列。 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组…