SpringSecurity6 学习

学习介绍

网上关于SpringSecurity的教程大部分都停留在6以前的版本 但是,SpringSecurity6.x版本后的内容进行大量的整改,网上的教程已经不能够满足 最新的版本使用。这里我查看了很多教程 发现一个宝藏课程,并且博主也出了一个关于SpringSecurity的权限认证的项目,前后端都有。且免费

哔站最好的SpringSecurity6讲解课程
以及三更草堂的SpringSecurity讲解 只不过版本不同。按需观看

认证流程

登录流程

我们来回想一下开始学习开发的时候如何做到一个登录校验的过程,这边以图解形式展示。
在这里插入图片描述
那么,在一些权限管理系统中 使用这种认证操作就会比较难以实现功能,
比如说我此时会员用户和普通用户 需要有不同的功能权限,依靠一个拦截器的情况下很难说实现。
此时就需要使用到springSecurity进行校验,SpringSecurity其中是一个过滤器链 对角色和权限认证提供了很好的对应接口。

SpringSecurity认证流程

这个图片是 哔站三更草堂 的授课资料中的,如果想要学习SpringSecurity5版本的可以去看这个内容,这张图现在是看不明白的,先记一下下面的基础概念。这部分内容分别是什么。
在这里插入图片描述
概念速查:
Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。
AuthenticationManager接口:定义了认证Authentication的方法
UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的
方法。
UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装
成UserDetails对象返回。然后将这些信息封装到Authentication对象中

引入SpringSecurity依赖

SpringSecurity也是Spring框架中的一种,所以他仍然需要依靠于Spring框架才能发挥作用
SpringSecurity maven坐标

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

此时我们使用浏览器访问一些自定义接口的时候会发现,多了一个校验内容,会跳转到一个登录界面,此时SpringSecurity就创建成功了,账号admin 密码会在控制台输出,现在我们可以进行下一步配置。
在这里插入图片描述

yml文件修改默认用户和密码

在Application.yml文件中初始化Security的账户和密码,配置重启项目 控制台就不会输出这个密码了

spring:security:user:name: adminpassword: 123456roles: ['admin','user']

其中这个配置文件生效的流程 主要是在SecurityProperties类中做了初始化的内容。

SpringSecurity配置类

这个配置类跟6之前版本的差别还是挺大的,6版本的配置类变成了依靠注解的形式进行定义。想要更改默认配置就自己重新注入对应的配置内容。这边我主要书写一下一部分配置的内容 标以注释的形式

@Configuration
// 这个注解的作用是标记一个Security类 启用SpringSecurity的自定义配置
@EnableWebSecurity
// 启用方法注解认证
@EnableMethodSecurity
public class SecurityConfig {/** 基本配置讲解* */
// 自定义用户名和密码 初始
// 一般替换成 自定义userDetailsService@Beanpublic UserDetailsService userDetailsService() {// 密 码 : 1234UserDetails build = User.withUsername("zhangsan").password("$2a$10$L5xB2VxwKM2kQL4SMTBdyej8e4VpfeMP3XF1660weV0n.WGRbsXdC")
//                .password("{noop}1234")
//                基础无加密的密码需要再前面跟上{noop}这个内容
//                角色的创建.roles("admin").build();UserDetails build1 = User.withUsername("user").password("$2a$10$L5xB2VxwKM2kQL4SMTBdyej8e4VpfeMP3XF1660weV0n.WGRbsXdC").roles("user").build();//这个是基于内容的储存校验InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();inMemoryUserDetailsManager.createUser(build);inMemoryUserDetailsManager.createUser(build1);return inMemoryUserDetailsManager;}
}
过滤器链

这个位置的书写 都写成lambda表达式了 和之前的不一致

    @Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {// 关闭csrf机制http.csrf(csrf->csrf.disable());// 在user下面的所有路径下 都不进行验证 其他的页面进行权限认证http.authorizeHttpRequests(auth->auth.requestMatchers("/user/**").permitAll().anyRequest().authenticated());return http.build();}
密码处理

一般以BCryptPasswordEncoder工具进行处理密码的内容,但是需要注意此时的时候你的初始密码必须是BCryptPasswordEncoder加密的内容

    @Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
授权

用户认证之后,会去存储用户对应的权限,并且给资源设置对应的权限,SpringSecurity支持两种粒度
的权限
基于请求的:在配置文件中配置路径,可以使用**的通配符
基于方法的:在方法上使用注解实现
动态权限:用户权限被修改之后,不需要用户退出,会自动刷新,也不需要修改代码

UserDetails build = User.withUsername("zhangsan").password("$2a$10$L5xB2VxwKM2kQL4SMTBdyej8e4VpfeMP3XF1660weV0n.WGRbsXdC")
//	.password("{noop}1234")
//	基础无加密的密码需要再前面跟上{noop}这个内容
//	角色的创建.roles("admin").authorities("test1:show").build();

进行授权authorities后需要加入A:B的这种形式

对请求中进行鉴权过滤
    @Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
//      配置关闭csrf机制,http.csrf(csrf -> csrf.disable());
//      配置请求拦截方式
//      requestMatchers() : 匹配资源路径
//      permitAll() :随意访问
//      anyRequest():其他任意请求
//      authenticated() : 需要认证之后http.authorizeHttpRequests(auth ->
//      auth.requestMatchers("/test1").hasRole("admin")
//      auth.requestMatchers("/test1").hasAnyRole("admin", "user")
//      auth.requestMatchers("/test1").hasAuthority("test1:show")
//		这个位置进行的路径鉴权 - 那一部分路径使用权限认证 那一部分不使用auth.requestMatchers("/test1").hasAnyAuthority("test1:show", "user:show").requestMatchers("/to_login").permitAll().anyRequest().authenticated()););return http.build();}

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

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

相关文章

【python】条件语句与循环语句

目录 一.条件语句 1.定义 2.条件语句格式 &#xff08;1&#xff09;if &#xff08;2&#xff09;if-else &#xff08;3&#xff09;elif功能 &#xff08;4&#xff09;if嵌套使用 3.猜拳游戏 二.循环语句 1. while循环 2.while嵌套 3.for循环 4.break和conti…

被问了n遍的小程序地理位置权限开通方法

小程序地理位置接口有什么功能&#xff1f; 在平时我们在开发小程序时&#xff0c;难免会需要用到用户的地理位置信息的功能&#xff0c;小程序开发者开放平台新规要求如果没有申请开通微信小程序地理位置接口( getLocation )&#xff0c;但是在代码中却使用到了相关接口&#…

人工智能概述与入门基础简述

人工智能&#xff08;AI&#xff09;是计算机科学的一个分支&#xff0c;它致力于创建能够执行通常需要人类智能的任务的机器。这篇科普文章将全面介绍人工智能的基本概念、发展历程、主要技术、实际应用以及如何入门这一领域。 一、人工智能的定义与发展历程 人工智能的概念…

springboot版本升级,及解决springsecurity漏洞问题

背景&#xff1a; 项目中要解决 Spring Security RegexRequestMatcher 认证绕过漏洞&#xff08;CVE-2022-22978&#xff09; 漏洞问题&#xff0c;并且需要将项目的版本整体升级到boot版本2.1.7&#xff0c;升级改造过程非常的痛苦&#xff0c;一方面对整个框架的代码不是很熟…

六淳科技IPO终止背后:十分着急上市,大额分红,实控人买豪宅

华西证券被暂停保荐业务资格6个月的影响力逐渐显现。 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;东莞六淳智能科技股份有限公司&#xff08;下称“六淳科技”&#xff09;及其保荐人撤回上市申请材料。因此&#xff0c;深圳证券交易所决定终止对其首次公开发行…

LangChain 概念篇(喂饭级)

LangChain 介绍 LangChain 是一个用于开发由语言模型驱动的应用程序的框架。 LangChain 框架的设计目标 支持应用程序让其不仅会通过 API 调用语言模型&#xff0c;而且还会数据感知&#xff08;将语言模型连接到其他数据源&#xff09;&#xff0c;Be agentic&#xff08;允…

专注 APT 攻击与防御—基于UDP发现内网存活主机

UDP简介&#xff1a; UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的协议&#xff0c;在第四层-传输层&#xff0c;处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点&#xff0c;也就是说&#xff0c;当报文发送之后&#xf…

spring高级篇(十)

1、内嵌tomcat boot框架是默认内嵌tomcat的&#xff0c;不需要手动安装和配置外部的 Servlet 容器。 简单的介绍一下tomcat服务器的构成&#xff1a; Catalina&#xff1a; Catalina 是 Tomcat 的核心组件&#xff0c;负责处理 HTTP 请求、响应以及管理 Servlet 生命周期。它包…

OpenHarmony实战开发-应用侧调用前端页面函数

应用侧可以通过runJavaScript()方法调用前端页面的JavaScript相关函数。 在下面的示例中&#xff0c;点击应用侧的“runJavaScript”按钮时&#xff0c;来触发前端页面的htmlTest()方法。 前端页面代码。 <!-- index.html --> <!DOCTYPE html> <html> <…

图片浏览器-PicView

一、前言 PicView 是一款适用于 Windows 10 或 11 的快速高效的图像查看器&#xff0c;配备了干净简洁的用户界面&#xff0c;可以在不需要时方便地隐藏。 二、支持类型 它支持广泛的图像文件类型&#xff0c;包括&#xff1a;WEBP、GIF、SVG、PNG、JXL、HEIC、PSD 三、软件特…

红日靶场ATTCK 1通关攻略

环境 拓扑图 VM1 web服务器 win7&#xff08;192.168.22.129&#xff0c;10.10.10.140&#xff09; VM2 win2003&#xff08;10.10.10.135&#xff09; VM3 DC win2008&#xff08;10.10.10.138&#xff09; 环境搭建 win7&#xff1a; 设置内网两张网卡&#xff0c;开启…

CNN笔记详解

CNN(卷积神经网络) 计算机视觉&#xff0c;当你们听到这一概念的是否好奇计算机到底是怎样知道这个图片是什么的呢&#xff1f;为此提出了卷积神经网络&#xff0c;通过卷积神经网络&#xff0c;计算机就可以识别出图片中的特征&#xff0c;从而识别出图片中的物体。看到这里充…

Python安装以及环境配置

目录 一、下载安装包二级目录三级目录 一、下载安装包 方式网址Python官网python.org镜像下载地址Download pythonpycharmDownload PyCharm https://blog.csdn.net/sun80760/article/details/135256627 二级目录 三级目录

认识ansible 了解常用模块

ansible是什么&#xff1f; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。是自动化运维工具&#xff0…

机器人操作系统ROS2学习 1

随着智能化时代的进程&#xff0c;机器人也在向着高度智能化的方向发展&#xff0c;这对应的机器人操作系统也就相应而生了。机器人操作系统ROS (Robot Operating System)的诞生为机器人系统的开发与应用带来了很大方便&#xff0c;也聚集了全球大量的应用开发人员推动ROS的发展…

hadoop学习---基于Hive的数仓搭建增量信息拉链表的实现

拉链表就是SCD2&#xff0c;它的优点是即满足了反应数据的历史状态&#xff0c;又能在最大程度上节省存储。 拉链表的实现需要在原始字段基础上增加两个新字段&#xff1a; start_time(表示该条记录的生命周期开始时间——周期快照时的状态)end_time(该条记录的生命周期结束时…

Python项目实战,用Python实现2048游戏

目录 写在前言项目介绍项目思路环境搭建项目实现初始化Python类初始化游戏窗口定义游戏棋盘和方块移动和合并游戏主循环 进一步探索 写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎…

在2G到4g小区重选过程中,4g频点没有优先级信息,最后UE无法重选到4g,是否正常?

这个确实是老问题了&#xff0c;要翻开GSM 的协议找答案。 GSM cell reselection算法分为cell ranking based和priority based两种方式。cell ranking based 只能从GSM重选到UTRAN&#xff1b;而priority based则可以重选到UTRAN和EUTRA。 根据priority based重选算法的描述&am…

Flink窗口理论到实践 | 大数据技术

⭐简单说两句⭐ ✨ 正在努力的小叮当~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &a…

数据库原理与应用实验三 嵌套查询

实验目的和要求 加深和掌握对嵌套查询的理解和应用 实验环境 Windows10 SQLServer 实验内容与过程 图书&#xff08;书号&#xff0c;书名&#xff0c;价格&#xff0c;出版社&#xff09; 读者&#xff08;卡号&#xff0c;姓名&#xff0c;年龄&#xff0c;所属单位&a…