Spring Security3.0版本

server/2024/9/24 11:11:12/

前言:

核心: A >>  ? >> B

?代表判断层,由Security实现

 

这是之前的版本浓缩,现在3.0版本添加了更匹配的内容描写,匹配了mvc模式

非mvc模式       核心:client(用户)>> filter(过滤器)>> servlet(业务)

mvc模式f9b1f13f60b34e25b3d524087f6acefe.png

ps:不要在意图片中的英文,有拼错的

正式开始


《等于号,不一定是等于,它可以是赋值,它可以是对标识符的一种定义》

<<

Filter(过滤器)= 包含特殊条件的判断

FilterChain(过滤链)= 包含多个特殊条件的判断 = Filter1 + Filter2 + Filter3 

FilterChainProxy(过滤链代理)= 根据特定需求而使用的FilterChain(过滤链)

a1ece19c17a14f119f9eebfffb205702.png

>>


 

基于官方文档的Security3.0配置

Hello Spring Security :: Spring Security Reference (springdoc.cn)

第一个大步骤(快速入门)

第一步:添加依赖(SpringBoot3 - Maven)

<dependencies><!-- ... 其他依赖元素 ... --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
</dependencies>

第二步:运行

20db4856f06647c1a9f6aedb0ebdf938.png

第一条横线,说明你成果导入了依赖

第二天横线,是用来进行一个依赖验证的访问端口

第三步:打开浏览器,访问端口

输入Tomcat端口号:127.0.0.1:8084(端口号)  /  localhost:8084(端口号)

注意:当你不知道端口号时,根据第二条横线Tomcat后面跟着的  数字(http) ,数字就是端口号(一般来说)

2ce7dfcece7f499f8efecbfc514cd354.png

第四步:登录

根据第一条横线password冒号后面的那一大串,进行一个密码输入

username输入什么,Security默认提供的user

6ce2aa653be346468e34e3471ed0337a.png

注意:password冒号后面有一个空格,不要复制

第五步:登陆成功

2ce5acd72ad9466c92e790e0789449ab.png

登录失败

9499ac25439f4bf2b20120305a0bdd8c.png

流程图(最基本的登录功能)

711ee2d9f1dc4ff8b33e99cf4d3b9201.png

 

看到这里,您已经完成了最简单的Security入门~

接下在会在这个基础上一步步加深

第二个大步骤(默认配置)

继续看文档

java">@EnableWebSecurity
@Configuration
public class DefaultSecurityConfig {@Bean@ConditionalOnMissingBean(UserDetailsService.class)InMemoryUserDetailsManager inMemoryUserDetailsManager() {String generatedPassword = // ...;return new InMemoryUserDetailsManager(User.withUsername("user").password(generatedPassword).roles("ROLE_USER").build());}@Bean@ConditionalOnMissingBean(AuthenticationEventPublisher.class)DefaultAuthenticationEventPublisher defaultAuthenticationEventPublisher(ApplicationEventPublisher delegate) {return new DefaultAuthenticationEventPublisher(delegate);}
}

这一大串代码是真的入人眼,虽然看不懂,但是不影响后续的发展

 

运行时异常

自动配置

Spring Boot 和 Spring Security 的默认安排在运行时提供了以下行为:

  • 任何端点(包括 Boot 的 /error 端点)都需要一个认证的用户。

  • 在启动时用生成的密码 注册一个默认用户(密码被记录到控制台;在前面的例子中,密码是 8e557245-73e2-4286-969a-ff57fe326336)。

  • 用 BCrypt 以及其他方式保护密码存储。

  • 提供基于表单的 登录 和 注销 流程。

  • 对 基于表单 的登录以及 HTTP Basic 进行认证。

  • 提供内容协商;对于web请求,重定向到登录页面;对于服务请求,返回 401 Unauthorized

  • 减缓 CSRF 攻击。

  • 减缓 Session Fixation 攻击。

  • 写入 Strict-Transport-Security,以 确保HTTPS。

  • 写入 X-Content-Type-Options 以减缓 嗅探攻击。

  • 写入保护认证资源的 Cache Control header。

  • 写入 X-Frame-Options,以缓解 点击劫持 的情况。

  • 与 HttpServletRequest 的认证方法 整合。

  • 发布 认证成功和失败的事件。

目的:

了解 Spring Boot 是如何与 Spring Security 协调来实现这一目标的,会有帮助。看看 Boot 的安全自动配置,它做了以下工作(为了说明问题而简化)

第一块官方介绍

  1. 添加了 @EnableWebSecurity 注解。(在其他方面,它将 Spring Security 的默认 Filter chain 作为 @Bean 发布)。

  2. 发布一个 UserDetailsService @Bean,其用户名是 user,密码是随机生成的,会被记录到控制台。

  3. 发布一个 AuthenticationEventPublisher @Bean,用于发布认证事件。

第二块官方介绍

Spring Boot 将任何以 @Bean 形式发布的 Filter 添加到应用程序的 filter chain 中。这意味着,结合 Spring Boot 使用 @EnableWebSecurity 会自动为每个请求注册 Spring Security 的 filter chain。

 

将这一大块的内容分成四个大部分来看,其实不算太复杂

第一部分(自动配置):从上到下,挨个运行

第一条:任何端点都需要一个认证用户

验证:

第一步:刷新浏览器(清除之前步骤的登录状态)

bd86d2ffb37f417f94ba5eab8e7226e7.png

从新回到这个页面

在上面的路径   /后面随便输入内容,并回车

a88f3aa48a614a9297460fc617a189c6.png

它自动回到了我们的登录页面

2575e376d33644ec9740ebae08b2bf38.png

第二步:完成登录

输入账号密码,完成登录会自动跳转到这个页面

48a36e4051ee4a508bd0feee8ebb69ca.png

第三步:复刻第一步,这个登录成功后没有/,自己手动打上去

a930a80a2b77463e88880106adc0e085.png

回车

fa756f77c6b74706a78d8cc47d3b46e7.png

并没有回到登录界面,路径显示的是我们输入的内容

结论

当没有验证时,访问任何端点都会强制回到登录页面

 

完美页面案例:淘宝 (alicdn.com)京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!淘宝 (alicdn.com)

你可以尝试不登陆去浏览京东,浏览3分钟不到,它就会自动跳转到登录页面,甚至想单看一个商品介绍,因为没登陆的缘故会自动跳转到登录页面,很烦,严重影响了我的购买欲望

淘宝也有这个,但是不明显

第二条:在启动时用生成的密码 注册一个默认用户(密码被记录到控制台;在前面的例子中,密码是 8e557245-73e2-4286-969a-ff57fe326336)。

这个在第一个大步骤里就有验证,第一条横线的password和默认的user账号

 

第三条:用 BCrypt 以及其他方式保护密码存储。

虽然没找到对应的代码,但是有一点可以确定

39b1edfe18e84136a045c2b1f14f91a8.png

它们两在同一个包里面,security里面

 

第四条:提供基于表单的 登录 和 注销 流程。

只要启动服务,输入端口号确实提供了登录,那么注销呢?

第一步:在访问路径上面输入 /logout

f037563228194ad290f3cee64e741cae.png

第二步:点击logOut就注销

 

前四条很明细的可以验证,后面几条在本地应用下验证不算特别明细,而且源码太多了,也就不做验证了

 

疑问:端点和端口有什么区别?

  • Requires an authenticated user for any endpoint (including Boot’s /error endpoint)

端口的英文是port

端点的英文是end-point

怎么区分他们,用报错来看,没错,用报错来补充定义是我觉得一个十分简单实用的方法

这些名词发展了这么久,英文,中文,在通过二手大佬翻译等等,导致词的含义早已不是最开始的含义,对着翻译去找难度不亚于我自己命名一个专属名字,所以用报错补充定义是一个十分好用的方法

这期先到这里,3.0.1更新具体报错的区分


http://www.ppmy.cn/server/46376.html

相关文章

JAVA多态

一.向上转型 上代吗&#xff1a; 这里我们定义了三个java文件&#xff0c;这里用ANM来接受一个Dog类型的类&#xff0c;我们发现不会报错&#xff0c;这就是发生了向上转型&#xff0c;由子类变成了父类 二.方法的重写 那么我们应该如何调用子类的函数呢 首先我们试一下直接…

Redis实现延迟队列

最近用到一个延迟消息的功能&#xff0c;第一时间想到使用MQ或者MQ的插件&#xff0c;因为数据量不大&#xff0c;所以尝试使用Redis来实现了&#xff0c;毕竟Redis也天生支持类似MQ的队列消费&#xff0c;所以&#xff0c;在这里总结了一下Redis实现延迟消息队列的方式。 一、…

vi和vim有什么不同?

vi 和 vim 都是流行的文本编辑器&#xff0c;它们之间有以下主要区别&#xff1a; 历史&#xff1a; vi 是一个非常古老的文本编辑器&#xff0c;最初由 Bill Joy 在 1976 年为 Unix 系统编写。vim&#xff08;Vi IMproved&#xff09;是 vi 的一个增强版&#xff0c;由 Bram M…

2024HBCPC:C Goose Goose Duck

题目描述 Iris 有 n n n 个喜欢玩鹅鸭杀的朋友&#xff0c;编号为 1 ∼ n 1∼n 1∼n。 假期的时候&#xff0c;大家经常会在群里问有没有人玩鹅鸭杀&#xff0c;并且报出现在已经参与的人数。 但是每个人对于当前是否加入游戏都有自己的想法。 具体的来说&#xff0c;对于第…

【MySQL】 1130 -Host ‘14.*.**.*‘ is not allowed to connect to this MySQL server

这个错误表明MySQL服务器拒绝了来自IP地址为14.*.**.*的主机的连接请求。这通常是由于MySQL用户的主机限制引起的。 要解决这个问题&#xff0c;你需要在MySQL中允许指定主机的连接。你可以按照以下步骤操作&#xff1a; 使用具有足够权限的用户&#xff08;如root用户&#x…

Strategy设计模式

Strategy设计模式举例。 看图&#xff1a; 代码实现&#xff1a; #include <iostream>using namespace std;class FlyBehavior { public:virtual void fly() 0; };class QuackBehavior { public:virtual void quack() 0; };class FlyWithWings :public FlyBehavior …

Java高级---Spring Boot---4核心概念

4 核心概念 4.1 Spring Boot的自动配置详解 自动配置 是 Spring Boot 的核心特性之一&#xff0c;它允许框架根据项目中添加的依赖自动配置应用程序。 EnableAutoConfiguration: 这个注解是自动配置的入口点&#xff0c;它告诉 Spring Boot 根据类路径上的库来自动配置 Spri…

c++学习----初识类和对象(上)

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完 成。…