前言:
核心: A >> ? >> B
?代表判断层,由Security实现
这是之前的版本浓缩,现在3.0版本添加了更匹配的内容描写,匹配了mvc模式
非mvc模式 核心:client(用户)>> filter(过滤器)>> servlet(业务)
mvc模式
ps:不要在意图片中的英文,有拼错的
正式开始
《等于号,不一定是等于,它可以是赋值,它可以是对标识符的一种定义》
<<
Filter(过滤器)= 包含特殊条件的判断
FilterChain(过滤链)= 包含多个特殊条件的判断 = Filter1 + Filter2 + Filter3
FilterChainProxy(过滤链代理)= 根据特定需求而使用的FilterChain(过滤链)
>>
基于官方文档的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>
第二步:运行
第一条横线,说明你成果导入了依赖
第二天横线,是用来进行一个依赖验证的访问端口
第三步:打开浏览器,访问端口
输入Tomcat端口号:127.0.0.1:8084(端口号) / localhost:8084(端口号)
注意:当你不知道端口号时,根据第二条横线Tomcat后面跟着的 数字(http) ,数字就是端口号(一般来说)
第四步:登录
根据第一条横线password冒号后面的那一大串,进行一个密码输入
username输入什么,Security默认提供的user
注意:password冒号后面有一个空格,不要复制
第五步:登陆成功
登录失败
流程图(最基本的登录功能)
看到这里,您已经完成了最简单的Security入门~
接下在会在这个基础上一步步加深
第二个大步骤(默认配置)
继续看文档
@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 的安全自动配置,它做了以下工作(为了说明问题而简化)
第一块官方介绍
-
添加了
@EnableWebSecurity
注解。(在其他方面,它将 Spring Security 的默认 Filter chain 作为@Bean
发布)。 -
发布一个 UserDetailsService
@Bean
,其用户名是user
,密码是随机生成的,会被记录到控制台。 -
发布一个 AuthenticationEventPublisher
@Bean
,用于发布认证事件。
第二块官方介绍
Spring Boot 将任何以 @Bean
形式发布的 Filter
添加到应用程序的 filter chain 中。这意味着,结合 Spring Boot 使用 @EnableWebSecurity
会自动为每个请求注册 Spring Security 的 filter chain。
将这一大块的内容分成四个大部分来看,其实不算太复杂
第一部分(自动配置):从上到下,挨个运行
第一条:任何端点都需要一个认证用户
验证:
第一步:刷新浏览器(清除之前步骤的登录状态)
从新回到这个页面
在上面的路径 /后面随便输入内容,并回车
它自动回到了我们的登录页面
第二步:完成登录
输入账号密码,完成登录会自动跳转到这个页面
第三步:复刻第一步,这个登录成功后没有/,自己手动打上去
回车
并没有回到登录界面,路径显示的是我们输入的内容
结论
当没有验证时,访问任何端点都会强制回到登录页面
完美页面案例:淘宝 (alicdn.com)京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!淘宝 (alicdn.com)
你可以尝试不登陆去浏览京东,浏览3分钟不到,它就会自动跳转到登录页面,甚至想单看一个商品介绍,因为没登陆的缘故会自动跳转到登录页面,很烦,严重影响了我的购买欲望
淘宝也有这个,但是不明显
第二条:在启动时用生成的密码 注册一个默认用户(密码被记录到控制台;在前面的例子中,密码是 8e557245-73e2-4286-969a-ff57fe326336
)。
这个在第一个大步骤里就有验证,第一条横线的password和默认的user账号
第三条:用 BCrypt 以及其他方式保护密码存储。
虽然没找到对应的代码,但是有一点可以确定
它们两在同一个包里面,security里面
第四条:提供基于表单的 登录 和 注销 流程。
只要启动服务,输入端口号确实提供了登录,那么注销呢?
第一步:在访问路径上面输入 /logout
第二步:点击logOut就注销
前四条很明细的可以验证,后面几条在本地应用下验证不算特别明细,而且源码太多了,也就不做验证了
疑问:端点和端口有什么区别?
-
Requires an authenticated user for any endpoint (including Boot’s
/error
endpoint)
端口的英文是port
端点的英文是end-point
怎么区分他们,用报错来看,没错,用报错来补充定义是我觉得一个十分简单实用的方法
这些名词发展了这么久,英文,中文,在通过二手大佬翻译等等,导致词的含义早已不是最开始的含义,对着翻译去找难度不亚于我自己命名一个专属名字,所以用报错补充定义是一个十分好用的方法
这期先到这里,3.0.1更新具体报错的区分