Spring Security 6 系列之一 - 开篇入门

之所以想写这一系列,是因为之前工作过程中使用Spring Security,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级为6.3.0,关键是其风格和内部一些关键Filter大改,导致在配置同样功能时,多费了些手脚,因此花费了些时间研究新版本的底层原理,这里将一些学习经验分享给大家。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 spring-boo-3.3.0(默认引入的Spring Security是6.3.0),JDK版本使用的是19,所有代码都在spring-security-study项目上:https://github.com/forever1986/spring-security-study.git

目录

  • 1 Spring Security
    • 1.1 身份认证
    • 1.2 访问控制(授权)
    • 1.3 其它框架
  • 2 第一个入门示例
  • 3 默认配置的原理
  • 4 通过yaml配置自定义账号密码

1 Spring Security

什么是Spring Security,以下是官方地址截图说明
在这里插入图片描述
这里是翻译工具翻译结果:

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是保护基于spring的应用程序的事实上的标准。
Spring Security是一个框架,专注于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring Security的真正强大之处在于它可以轻松地扩展以满足自定义需求

我们可以从描述中把握几个关键词:身份认证访问控制(授权)标准自定义需求
说明Spring Security是一个具备身份认证和访问控制的框架,其流程认证和授权流程具备一定行业标准,同时还能通过其扩展点自定义符合自己业务的需求。下面我们就身份认证和授权2个功能以及其它类似Spring Security框架做一下详细说明

1.1 身份认证

我们在做业务系统的时候,对于某些界面、接口都需要做登录认证,其实就是身份认证。只有通过身份认证的请求才能访问程序,不然就会返回http401状态。Spring Security就默认内置身份认证功能,让用户无需太多代码,即可实现一个简单用户密码登录认证。

1.2 访问控制(授权)

访问控制或者授权,其目的是对资源进行细粒度的控制,比如某个页面或者接口,只有具备什么权限的用户才能够访问。我们如果做过权限系统,应该了解ACLs、RBAC、ABAC等权限模式,而Spring Security就内置了一种标准的权限模式,可通过配置或者注解方式实现类似ACLs权限模式。

1.3 其它框架

除了Spring Security之外,是否有类似的其它安全框架
Apache Shrio:Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。相对于Spring Security来说,是一款轻量级的框架
Sa-Token:Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0、微服务网关鉴权 等一系列权限相关问题,并且它是国内的开源项目。github上这么写:当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅!
CAS (Central Authentication Service):CAS是一个独立的企业级单点登录解决方案,为Web应用程序提供了一个集中的认证机制。它允许用户在多个应用程序中使用相同的凭证进行登录。

2 第一个入门示例

Spring Security其实是一个入门门槛较高的框架,但是自从和spring-boot集成之后,其使用就简便很多。话不多说,我们开始体验一把。

新建一个父模块:spring-security-study,该模块只作为统一pom引入作用,没有其它功能或代码
入门示例代码参考lesson01子模块

1)新建一个父模块spring-security-study,其pom文件引入如下:(这里只是声明版本,有些引入只是为了后面使用提前引入而已)

<?xml version="1.0" encoding="UTF-8"?>
<properties><maven.compiler.source>19</maven.compiler.source><maven.compiler.target>19</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-boot.version>3.3.0</spring-boot.version><commons-pool2.version>2.12.0</commons-pool2.version><jaxb-api.version>2.3.1</jaxb-api.version><jjwt.version>0.9.0</jjwt.version><lombok.version>1.18.36</lombok.version><mybatis-plus.version>3.5.5</mybatis-plus.version><mysql.version>8.0.19</mysql.version><druid.version>1.2.9</druid.version><fastjson.version>1.2.83</fastjson.version></properties><dependencyManagement><dependencies><!-- 引入spring boot依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- lombok依赖,用于get/set的简便--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><!-- mysql依赖,用于连接mysql数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- mybatis-plus依赖,用于使用mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>${mybatis-plus.version}</version><type>jar</type></dependency><!-- jjwt依赖,用于使用JWT--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>${jjwt.version}</version></dependency><!-- jaxb-api依赖,在java17之后,被移除了,但是在做JWT解析时需要使用--><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>${jaxb-api.version}</version></dependency><!-- pool2和druid依赖,用于mysql连接池--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>${commons-pool2.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><!-- fastjson依赖,用于json转换--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency></dependencies></dependencyManagement><!-- maven仓库 --><repositories><repository><id>central</id><url>https://maven.aliyun.com/repository/central</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories>

2)新建子模块lesson01,其pom文件引入如下:

<dependencies><!--Spring Boot 的 web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Spring Boot 提供的 Security 启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
</dependencies>

3)在子模块lesson01,新建一个DemoController,里面有一个demo接口,返回简单字符串

@RestController
public class DemoController {@GetMapping("/demo")public String demo() {return"demo";}
}

4)设置启动类SecurityLesson01Application,并启动项目
5)访问:http://127.0.0.1:8080/demo 你会得到以下的界面
在这里插入图片描述
是的,你被强制需要登录才能访问demo接口

6)这时候输入用户名:user,密码(在控制台有一串自动生成的密码,如下图)。之后你就能访问demo页面

在这里插入图片描述

3 默认配置的原理

我们看到只需要引入一个spring-boot-starter-security的依赖,整个项目就会被Spring Security给管理起来。那么spring-boot-starter-security到底做了什么。
熟悉spring-boot的朋友都知道,约定大于配置。在spring-boot中就是默认对Spring Security进行了配置。
1)我们可以从spring-boot的autoconfigure中找到SecurityAutoConfiguration的自动化配置
在这里插入图片描述
2)进入SecurityAutoConfiguration这个配置类,该类没什么内容,但是注解中有2个类SpringBootWebSecurityConfiguration.class和SecurityProperties.class比较重要
在这里插入图片描述

3)SpringBootWebSecurityConfiguration类中的defaultSecurityFilterChain就是默认配置。这里简单说明一下每一步骤的作用。我们先知道Spring Security是基于一个Filter过滤器的链路方式进行一系列操作,后续会着重讲解其不同过滤器的作用。
在这里插入图片描述

这里说明一下,Spring Security的认证方式有多种,里面包括formLogin方式、HTTP Basic等,甚至可以自定义。如果你不使用默认HTTP认证,而是配置HTTP Basic。那么认证就不是通过一个登录页面,而是会弹出一个HTTP Basic对话框(如下图),有兴趣的朋友可以去了解一下HTTP Basic authentication(就是在Postman工具有一项Authorization配置),这里就不细说。
在这里插入图片描述

4)SecurityProperties类就是定义登录的用户名和密码,里面头部的properties注解是读取yaml配置,如果没有yaml配置,则给出一个默认用户user以及随机生成一串密码。这就解释了为什么我们什么都没配置,Spring Security就开始工作,还给我们生成了用户名密码

在这里插入图片描述

4 通过yaml配置自定义账号密码

我们可以通过配置application.yml文件,为Spring Security配置默认用户名和密码,这样就不会使用默认user和随机密码

server:port: 8080
spring:application:name: lesson01security:user:name: moopassword: 1234

结语:问题来了,即使通过这种配置自定义账号密码,在业务上面来说,也不会有人将用户名和密码放到配置文件中,一般都会放到数据库中。那么Spring Security也考虑到这种情况,下一章我们来讲解:Spring Security基于数据库的用户认证和认证原理

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

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

相关文章

docker 搭建自动唤醒UpSnap工具

1、拉取阿里UpSnap镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/upsnap/upsnap:4 2、创建docker-compose.yml文件&#xff0c;进行配置&#xff1a; version: "3" services:upsnap:container_name: upsnapimage: crpi-k5k93ldwf…

7.Linux - 安装MySQL、Tomcat、Nginx、RabbitMQ、Redis

Linux - 安装MySQL 文章目录 Linux - 安装MySQL一、MySQL 5.71.1 安装1.2 配置 二、MySQL 8.x2.1 安装2.2 配置 三、Tomcat安装3.1 安装 JDK3.2 Tomcat&#xff08;整的不行&#xff09; 四、Nginx4.1 安装 五、RabbitMQ5.1 安装 六、Redis6.1 安装 一、MySQL 5.7 1.1 安装 我…

python | linux | ModuleNotFoundError: No module named ‘WFlib‘ |找不到模块

问题&#xff1a; (base) beautyby521-7:~/Website-Fingerprinting-Library-master$ bash scripts/NetCLR.sh Traceback (most recent call last):File "/home/beauty/Website-Fingerprinting-Library-master/exp/pretrain.py", line 8, in <module>from WFli…

AI Agent:重塑业务流程自动化的未来力量(2/30)

《AI Agent&#xff1a;重塑业务流程自动化的未来力量》 摘要&#xff1a;整体思路是先介绍 AI Agent 的基本情况&#xff0c;再深入阐述其实现业务流程自动化的方法和在不同领域的应用&#xff0c;接着分析其价值和面临的挑战&#xff0c;最后得出结论&#xff0c;为读者全面…

机器学习之 K-Means

1. 什么是 K-Means&#xff1f; K-Means 是一种常用的无监督学习算法&#xff0c;主要用于聚类分析任务。其目标是将数据集划分为 K 个不同的簇&#xff0c;使得同一簇内的数据点之间的相似性更高&#xff0c;而不同簇的数据点差异更大。K-Means 算法使用了一个简单而有效的迭…

上传文件时获取音视频文件时长和文本文件字数

获取音视频文件时长和文本文件字数 一、获取音视频文件时长二、计算文本文件字数 最近有个需求&#xff0c;要求上传文件时获取音视频文件时长和文本文件字数&#x1f436;。 发现这样的冷门资料不多&#xff0c;特做个记录。本文忽略文件上传功能&#xff0c;只封装核心的工具…

【AIGC】与模型对话:理解与预防ChatGPT中的常见误解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;模型的工作原理和用户期望差异人工智能模型的基本工作原理认知上的局限与误解用户期望与模型实际能力的差距精确理解用户意图的重要性实际应用中的建议 &…

AI视频配音技术创新应用与商业机遇

随着人工智能技术的飞速发展&#xff0c;AI视频配音技术已经成为内容创作者和营销人员的新宠。这项技术不仅能够提升视频内容的吸引力&#xff0c;还能为特定行业带来创新的解决方案。本文将探讨AI视频配音技术的应用场景&#xff0c;并讨论如何合法合规地利用这一技术。 AI视频…

信创改造-Spring Boot 项目部署至 TongWeb

打 war 包参考&#xff1a;https://blog.csdn.net/z1353095373/article/details/144330999

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…

【C++】set和map的使用

set和map的使用 1.序列式容器和关联式容器1.1序列式容器:1.2关联式式容器: 2.set的使用2.1set和multiset参考文档2.2set类的介绍2.3set的构造和迭代器2.4set的增删查2.5multiset和set的差异 3map系列的使用3.1 map和multimap参考文档3.2map类的介绍3.3pair类型介绍3.4map的构造…

[LeetCode-Python版]206. 反转链表(迭代+递归两种解法)

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#xff1…

快速上手Neo4j图关系数据库

参考视频&#xff1a; 【IT老齐589】快速上手Neo4j网状关系图库 1 Neo4j简介 Neo4j是一个图数据库&#xff0c;是知识图谱的基础 在Neo4j中&#xff0c;数据的基本构建块包括&#xff1a; 节点(Nodes)关系(Relationships)属性(Properties)标签(Labels) 1.1 节点(Nodes) 节点…

window.getSelection() 获取划线内容并实现 dom 追随功能

功能&#xff1a;鼠标对一段文本中某些文字进行划线之后&#xff0c;需要在当前划线文本处出现一个功能按钮显示对划线内容进行操作&#xff0c;比如收藏、添加样本库等功能。 一、需要了解的鼠标事件对象属性 给 dom 元素注册鼠标事件之后&#xff0c;会有 event 属性&#…

2024安装hexo和next并部署到github和服务器最新教程

碎碎念 本来打算写点算法题上文所说的题目&#xff0c;结果被其他事情吸引了注意力。其实我之前也有过其他博客网站&#xff0c;但因为长期不维护&#xff0c;导致数据丢失其实是我懒得备份。这个博客现在部署在GitHub Pages上&#xff0c;github不倒&#xff0c;网站不灭&…

Chinese-Clip实现以文搜图和以图搜图

本文不生产技术&#xff0c;只做技术的搬运工&#xff01; 前言 目前网上能够找到的资料有限&#xff0c;要么收费&#xff0c;要么配置复杂&#xff0c;作者主打一个一毛不拔&#xff0c;决定自己动手实现一个&#xff0c;功能清单受启发于Nidia AI lab实验室的nanodb项目&am…

Abaqus混凝土梁三点弯曲开裂模拟基于随机多边形骨料及界面过渡区模型

在细观混凝土开裂研究中&#xff0c;仿真可直观揭示混凝土中多相材料的破坏特征及微观裂缝的发展规律。本案例建立包含随机多边形粗骨料、界面过渡区&#xff08;ITZ&#xff09;及水泥砂浆在内的细观混凝土梁二维模型&#xff0c;对混凝土梁在三点弯曲工况下进行有限元模拟&am…

Qt之修改窗口标题、图标以及自定义标题栏(九)

Qt开发 系列文章 - titles-icons-titlebars&#xff08;九&#xff09; 目录 前言 一、修改标题 二、添加图标 三、更换标题栏 1.效果演示 2.创建标题栏类 3.定义相关函数 4.使用标题栏类 总结 前言 在我们利用Qt设计软件时&#xff0c;经常需要修改窗口标题、更改软…

渗透测试之js利用

引言 在渗透测试中&#xff0c;js利用是一个非常重要的部分&#xff0c;作为一个网络安全人员&#xff0c;我也是经常利用到这一模块&#xff0c;首先&#xff0c;js是什么呢 什么是js JavaScript(简称js)&#xff0c;javascript和java虽然名字相似&#xff0c;但两个东西却…

请确保 $(OutDir)、$(TargetName) 和 $(TargetExt) 属性值与 %(Link.OutputFile) 中指定的值匹配

vs版本升级时&#xff0c;编译时会出现上述问题&#xff0c;如原来在2017下编译的程序&#xff0c;后来改用2019&#xff0c;出现上述问题。需要在解决方案-通用属性-调试源文件下变更相应设置。