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: admin
		password: 123456
		roles: ['admin','user']

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

SpringSecurity配置类

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

@Configuration
// 这个注解的作用是标记一个Security类 启用SpringSecurity的自定义配置
@EnableWebSecurity
// 启用方法注解认证
@EnableMethodSecurity
public class SecurityConfig {
    /*
     * 基本配置讲解
     * */
// 自定义用户名和密码 初始
// 一般替换成 自定义userDetailsService
    @Bean
    public UserDetailsService userDetailsService() {
        // 密 码 : 1234
        UserDetails 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表达式了 和之前的不一致

    @Bean
    public 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加密的内容

    @Bean
    public 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的这种形式

对请求中进行鉴权过滤
    @Bean
    public 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();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解锁AI新纪元:如何用好大语言模型?

在20世纪末和21世纪初&#xff0c;⼈类经历了两次信息⾰命的浪潮&#xff1a; 第⼀次是互联网时代的兴起&#xff0c;将世界各地连接在⼀起&#xff0c;改变了⼈们获取信息和交流的⽅式。 第⼆次则是移动互联网时代的到来&#xff0c;智能⼿机和移动应⽤程序的普及使⼈们可以…

Oracle 数据库全面升级为 23ai

从 11g 到 12c 再到 19c&#xff0c;今天&#xff0c;我们迎来了 23ai &#xff01; “ Oracle AI Vector Search allows documents, images, and relational data that are stored in mission-critical databases to be easily searched based on their conceptual content Ge…

平平科技工作室-Python-猜数字游戏

一.代码展示 import random print(__猜数字游戏__) print(由平平科技工作室制作) print(游戏规则:1至10随机数随便猜) print (三次没猜对游戏结束) numrandom.randint (1,10) for i in range(3):aint(input(输入你想要猜测的数字))if a>num:print (数字猜的有点大了)elif a…

MySQL-数据缓冲池(Buffer Pool)

InnoDB存储引擎以 页 为单位管理存储空间&#xff0c;增删改查的本质就是访问页面。为提高查询效率&#xff0c;DBMS会占用内存作为缓冲池&#xff0c;在执行SQL之前&#xff0c;会将磁盘上的页 缓存到内存中的 缓冲池&#xff08;Buffer Pool&#xff09;后执行相关SQL语句。 …

git学习指南

文章目录 一.版本控制1.认识版本控制2.版本控制功能3.集中式版本控制4.分布式版本控制 二.Git的环境安装搭建1.Git的安装2.Git配置分类3.Git配置选项 三.Git初始化本地仓库1. git init/git clone-获取Git仓库2. 本地仓库文件的划分3. git status-检测文件的状态4. git add-文件…

数据库基础--MySQL多表查询之外键约束

MySQL多表关系 一对一 顾名思义即一个对应一个的关系&#xff0c;例如身份证号对于每个人来说都是唯一的&#xff0c;即个人信息表与身份证号信息表是一对一的关系。车辆信息表与车牌信息表也是属于一对一的关系。 一对多 即一个表当中的一个字段信息&#xff0c;对应另一张…

黑马面试篇1

目录 一、面试准备 二、Redis篇 ​编辑1. 布隆过滤器&#xff1a; 2. 缓存击穿概念&解决方案 3. 双写一致 4. 持久化 1&#xff09;RDB的执行原理&#xff1f; 2&#xff09;AOF vs RDB 5. 数据过期策略 6. 数据淘汰策略 7. 分布式锁 8. Redis集群 1&#xff…

如何选择一个出色的APP内测分发平台 - 探讨小猪APP分发平台

在众多APP内测分发平台中如何选择一个出色的APP内测分发平台 - 探讨小猪APP分发平台&#xff0c;小猪APP分发平台&#xff08;zixun.ppzhu.net&#xff09;以其出色的服务和高效的推广机制成为行业佼佼者。 小猪APP分发平台的核心优势 小猪APP分发平台不仅以其用户友好的界面赢…

Coze扣子开发指南:搭建一个免费的微信公众号AI客服

运营微信公众号的自媒体&#xff0c;现在借助Coze扣子可以非常好用而且免费的7*24客服了&#xff0c;完全不需要任何编程基础&#xff0c;操作非常简单&#xff1a; 打开Coze扣子&#xff0c;新建一个bot&#xff0c;输入bot名称、功能介绍和图标&#xff1a; 选择大语言模型&…

论文笔记(四十五)Attention Is All You Need

Attention Is All You Need 文章概括摘要1. 介绍2. 背景3. 模型架构3.1 编码器和解码器堆栈3.2 Attention3.2.1 按比例点积Attention3.2.2 Multi-Head Attention3.2.3 注意力在模型中的应用 3.3 定位前馈网络3.4 嵌入与 Softmax3.5 位置编码 4 为什么 Self-Attention5. Trainin…

OpenWRT部署Zerotier虚拟局域网实现内网穿透

前言 细心的小伙伴肯定已经发现了&#xff1a;电脑上部署了Zerotier&#xff0c;如果路由器也部署了OpenWRT&#xff0c;那是否能远程访问呢&#xff1f; 答案是肯定的。 OpenWRT部署Zerotier有啥好处&#xff1f; 那好处必须多&#xff0c;其中的一个便是在外远程控制家里…

Win11安装Postgresql(更新于24.5)

Postgresql是一个功能强大的开源对象关系数据库系统&#xff0c;拥有超过 35 年的积极开发经验&#xff0c;这为其在可靠性、功能稳健性和性能方面赢得了良好的声誉。 1.安装程序下载 根据系统版本型号选择对应安装程序完成下载 网址&#xff1a; https://www.enterprisedb…

自定驾驶A*算法的思路

1. 背景 2 算法理论 2. 1.A*算法公式 2.2. H是不确定的 2.4. H使用的启发函数 2.5. 曼哈顿距离

电机控制系列模块解析(14)—— 脉冲频率/幅值/密度调制

一、脉冲序列调制&#xff08;PSM&#xff09; 脉冲宽度调制&#xff08;PWM&#xff09;、脉冲幅值调制&#xff08;PAM&#xff09;和脉冲密度调制&#xff08;PDM&#xff09;都是脉冲序列调制技术&#xff0c;它们通过改变脉冲信号的某一特性&#xff08;宽度、幅值或密度…

机器学习每周挑战——二手车车辆信息交易售价数据

这是数据集的截图 目录 背景描述 数据说明 车型对照&#xff1a; 燃料类型对照&#xff1a; 老规矩&#xff0c;第一步先导入用到的库 第二步&#xff0c;读入数据&#xff1a; 第三步&#xff0c;数据预处理 第四步&#xff1a;对数据的分析 第五步&#xff1a;模型建…

深入了解 Arthas:Java 应用程序诊断利器

序言 在 Java 应用程序的开发和运维过程中&#xff0c;诊断和解决性能问题是一项非常重要的任务。而 Arthas 作为一款由阿里巴巴开发的 Java 应用程序诊断工具&#xff0c;提供了一系列强大的功能&#xff0c;帮助开发人员实时监控、诊断和调优Java 应用程序。本文将深入介绍 …

压缩机的实际制冷量

制冷压缩机是制冷系统的“心脏”&#xff0c;吸收来自蒸发器的制冷剂蒸气&#xff0c;提高压力后排气到冷凝器&#xff0c;使制冷剂在系统中循环流动。 按温度范围可以分为高温&#xff0c;中温&#xff0c;低温制冷压缩机。按密封结构形式分类为开启式&#xff1b;半封闭式&a…

深度学习每周学习总结P7(咖啡豆识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 –来自百度网盘超级会员V5的分享 数据链接 提取码&#xff1a;7zt2 –来自百度网盘超级会员V5的分享 目录 0. 总结1. 数据导入及处理部分…

【Linux】学习笔记

文章目录 [toc]第一章&#xff1a;基础篇01|课程介绍02|内容综述03|什么是Linux04|Linux的内核版本及常见发行版内核版本发行版本Red Hat Enterprise LinuxFedoraCentOSDebianUbuntu 05|安装VirtualBox虚拟机VirtualBox下载url 06|在虚拟机中安装Linux系统Linux安装镜像下载 07…

020、Python+fastapi,第一个Python项目走向第20步:ubuntu 24.04 docker 安装mysql8、redis(一)

系列文章 pythonvue3fastapiai 学习_浪淘沙jkp的博客-CSDN博客https://blog.csdn.net/jiangkp/category_12623996.html 前言 docker安装起来比较方便&#xff0c;不影响系统整体&#xff0c;和前面虚拟环境有异曲同工之妙&#xff0c;今天把老笔记本T400拿出来装了个ubuntu24…