目录
1. Spring Security 简介
1.1 Spring Security 的作用与优势
1.2 spring-boot-starter-security 启动器简介
2. Spring Security 自动配置
2.1 核心依赖解析
2.1.1 Spring Boot 自动为应用配置默认的安全设置,关键功能包括:
2.1.2 创建 默认的 AuthenticationManager 和 SecurityFilterChain。
2.1.2.1 AuthenticationManage
2.1.2.2 SecurityFilterChain
2.2 自动配置的关键类和功能
2.2.1 SecurityAutoConfiguration 类:启用基本的安全功能,如 HTTP 基本认证和表单登录。
2.2.2 默认用户和密码:自动生成用户名 user 和随机密码,帮助开发者快速启动安全功能。
2.2.3 WebSecurityConfigurerAdapter:允许开发者自定义安全配置,如 URL 路径保护、表单登录等。
2.2.4 CSRF 和 CORS 配置:默认启用 CSRF 防护,支持跨域资源共享(CORS)。
3. Spring Security 配置
3.1 启用 Spring Security
3.1.1 @EnableWebSecurity 注解
3.1.2 继承 WebSecurityConfigurerAdapter
3.2 SecurityAutoConfiguration 解析
3.3 默认安全配置与自定义
4. 身份验证与授权
4.1 基于表单的身份验证 (Form Login)
4.2 HTTP Basic 认证
4.3 LDAP 或数据库集成
4.4 基于角色的授权
5. 跨站请求伪造 (CSRF) 与 跨域资源共享 (CORS)
5.1 CSRF 防护
5.2 CORS 配置
6. 自定义认证与授权
6.1 创建自定义 UserDetailsService
6.2 JWT 无状态认证
6.3 OAuth2 认证
7. 安全性最佳实践
7.1 密码加密与存储
7.2 安全的 HTTP Headers 配置
7.3 防止常见安全漏洞
8. 集成其他 Spring Security 功能
8.1 OAuth2 集成
8.2 Spring Session 集成
8.3 Spring Security 与 Actuator 结合
-
1. Spring Security 简介
-
1.1 Spring Security 的作用与优势
- 作用:
-
认证 (Authentication):验证用户身份,常见方式有用户名密码、Token、OAuth2 等。
-
授权 (Authorization):确定已认证用户是否有权限访问特定资源。
-
安全审计 (Audit):记录用户行为生成安全日志。
-
会话管理 (Session Management):防止会话劫持等安全漏洞,确保会话安全。
-
防止攻击:防止 CSRF、XSS、点击劫持等常见攻击。
-
加密与解密:提供密码加密机制,如 bcrypt、PBKDF2。
-
- 优势:
-
可扩展性强:支持多种认证方式(如表单认证、JWT、OAuth2、LDAP 等),提供极大的灵活性。
-
与 Spring 完美集成:作为 Spring 生态的一部分,能无缝协作。
-
默认的安全配置:提供合理的默认配置,能确保基本安全性,同时支持定制化配置。
-
自动化与开箱即用:Spring Boot 提供
spring-boot-starter-security
启动器,简化集成过程。
-
- 作用:
-
1.2 spring-boot-starter-security 启动器简介
-
自动配置安全功能(如 HTTP 基本认证、表单登录、CSRF 防护等)。
-
简化配置,通过少量配置定制应用的安全行为。
-
支持多种身份验证方式(如 HTTP 基本认证、表单认证、OAuth2、LDAP 等)。
- 核心依赖:
-
Spring Security、Spring Boot Auto Configuration、Spring Security Web 模块。
-
- 引入方式:
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
-
-
-
2. Spring Security 自动配置
-
2.1 核心依赖解析
-
2.1.1 Spring Boot 自动为应用配置默认的安全设置,关键功能包括:
-
启用 HTTP Basic 认证。
-
什么是HTTP Basic
-
HTTP Basic 认证(HTTP Basic Authentication)是一种最简单的 HTTP 协议认证方式,它通过在 HTTP 请求头部传递用户名和密码来进行用户身份验证。
-
工作原理:
-
客户端请求:当客户端(如浏览器或 API 客户端)访问一个受保护的资源时,服务器会返回一个 401 Unauthorized 响应,表示客户端需要提供认证信息。
-
客户端提供凭证:客户端根据响应提示,向用户请求用户名和密码,并将其组合为一个字符串(格式:
username:password
),然后对这个字符串进行 Base64 编码。 -
发送认证信息:客户端将编码后的凭证添加到 HTTP 请求头部的
Authorization
字段中,格式为: -
Authorization: Basic <base64-encoded-credentials>
-
-
安全性:
-
明文传输:HTTP Basic 认证将用户名和密码以明文形式(经过 Base64 编码)发送。Base64 编码并不提供加密保护,只是对数据进行编码。因此,HTTP Basic 认证 在未使用 HTTPS(加密的 HTTP)时是非常不安全的,因为凭证可以被中间人(Man-in-the-Middle)攻击窃取。
-
建议:为了确保安全,HTTP Basic 认证必须通过 HTTPS 来传输,以防止敏感信息在网络传输中被截取。
-
-
使用场景:
-
HTTP Basic 认证通常用于简单的场景或开发阶段,如:
-
小型应用、个人项目或内部应用。
-
需要快速实现认证的场景,但不适合大规模生产环境中的敏感信息传输。
-
-
优缺点:
优点:
-
简单易实现:客户端只需要提供用户名和密码,服务器验证即可。
-
无需额外的配置或复杂的认证流程。
-
-
缺点:
-
安全性差:如果没有使用 HTTPS,凭证容易被窃取。
-
不适合复杂的认证和授权需求,如支持多因素认证、第三方认证(如 OAuth2)等。
-
无法有效管理用户会话,适用于短期或简单的认证需求。
-
-
-
-
启用 CSRF 防护。
-
什么是CSRF(一般前后端分离 会禁用这个吧)
-
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击方式,攻击者通过诱使已认证的用户在不知情的情况下执行不希望的操作,借此在用户和服务器之间伪造请求,从而达到攻击目的。
-
CSRF 攻击的基本原理:
-
受害者登录应用:用户在某个网站(例如银行、社交媒体等)登录并且获得了有效的身份验证信息(如登录状态、Session 等)。
-
攻击者诱导用户发起请求:攻击者通过构建一个恶意网站或页面,诱使已经登录该应用的用户去访问这个恶意网站。这个网站包含了一个伪造的请求,通常通过表单、图片、AJAX 请求等方式自动发送。
-
浏览器发送请求:由于受害者已经登录目标网站,且该网站基于 Session 或 Cookie 进行身份验证,浏览器会自动带上用户的身份信息(如 Cookie 或 Session ID),将伪造的请求发送到目标网站。
-
服务器处理请求:目标网站的服务器会认为这是一个合法的请求,因为它带有有效的身份信息(如用户的 Cookie)。因此,服务器会执行请求中的操作(如转账、修改密码、删除数据等),而受害者并不知情。
-
-
CSRF 攻击的条件:
-
用户已登录并保持登录状态:攻击者通过利用用户的登录状态来伪造请求。
-
受害者的浏览器会自动带上身份信息:例如,用户已登录的站点通过 Cookie 或 Session 来验证身份,浏览器会自动将这些信息带入请求中。
-
攻击者无法获取服务器的认证信息:CSRF 利用的是目标网站的身份认证(如 Cookie 或 Session),而不是攻击者直接获取用户的认证信息。
-
-
-
-
-
2.1.2 创建 默认的 AuthenticationManager 和 SecurityFilterChain。
-
在 Spring Security 中,
AuthenticationManager
和SecurityFilterChain
是两个核心的组件,分别负责身份验证和请求过滤。在 Spring Boot 中,通过自动配置和默认设置,这两个组件通常会由 Spring Security 自动创建和配置,但开发者也可以根据需求进行自定义配置。 -
2.1.2.1 AuthenticationManage
-
AuthenticationManager
是Spring Security中负责处理认证(authentication)请求的组件,它的作用是验证用户的身份是否合法。Spring Security默认使用ProviderManager
作为实现,它可以委托给多个AuthenticationProvider
来处理认证过程。在Spring Security的配置中,我们通常会通过以下两种方式来创建
AuthenticationManager
: -
默认配置: 如果没有特别的自定义需求,Spring Security会自动为你配置一个默认的
AuthenticationManager
。 -
自定义配置: 你可以自定义
AuthenticationManager
来满足更具体的需求。
-
-
2.1.2.2 SecurityFilterChain
-
SecurityFilterChain
定义了Spring Security如何处理HTTP请求。它是一个过滤器链,用来对进入应用程序的HTTP请求进行安全检查。每个过滤器负责一个特定的安全任务,例如认证、授权、CSRF保护等。Spring Security提供了多个默认的过滤器,例如:
-
UsernamePasswordAuthenticationFilter
:用于处理基于用户名和密码的认证请求。 -
BasicAuthenticationFilter
:用于处理HTTP Basic认证。 -
ExceptionTranslationFilter
:处理认证和授权异常。 -
FilterSecurityInterceptor
:用来对HTTP请求进行授权判断。
-
-
-
-
-
2.2 自动配置的关键类和功能
-
2.2.1 SecurityAutoConfiguration 类:启用基本的安全功能,如 HTTP 基本认证和表单登录。
-
SecurityAutoConfiguration
是 Spring Boot 自动配置类之一,它是启用 Spring Security 功能的核心类。Spring Boot 会根据项目的依赖和配置来自动配置 Spring Security,具体包括以下功能: -
启用 HTTP 基本认证和表单登录: 默认情况下,Spring Boot 启用 HTTP 基本认证和表单登录,以帮助开发者快速启动应用的安全功能。无论你是否进行自定义配置,Spring Security 都会为你提供基本的身份验证机制。
-
默认安全策略: 自动配置会启用一些常见的安全功能,如:
-
默认启用身份验证过滤器链(包括表单登录、用户名密码认证等)。
-
默认启用 HTTP Basic 认证(适用于无状态的 RESTful API)。
-
自动生成一个默认的
AuthenticationManager
,它允许开发者在需要时直接使用。 -
默认启用一些默认的角色、用户和密码配置。
-
-
-
2.2.2 默认用户和密码:自动生成用户名
user
和随机密码,帮助开发者快速启动安全功能。-
当你在 Spring Boot 项目中没有显式配置身份验证信息时,Spring Boot 自动配置会生成一个默认的用户和密码。这个默认用户具有以下特征:
-
用户名:
user
-
密码: 随机生成(每次启动时都不同)
-
例如,应用启动时控制台会输出如下信息,显示生成的默认密码:
-
Using default security password: 12345678
-
-
2.2.3 WebSecurityConfigurerAdapter:允许开发者自定义安全配置,如 URL 路径保护、表单登录等。
WebSecurityConfigurerAdapter
是一个扩展类,用于自定义和定制 Spring Security 的配置。你可以继承WebSecurityConfigurerAdapter
类来创建自定义的安全配置类,以便在默认的安全配置基础上进行扩展和修改。WebSecurityConfigurerAdapter
提供了以下常用的方法:-
configure(HttpSecurity http)
:允许你配置 HTTP 请求的安全规则,例如 URL 路径的访问控制(哪些请求需要认证,哪些请求是公开的),启用或禁用表单登录、HTTP Basic 认证、CSRF 防护等。 -
configure(AuthenticationManagerBuilder auth)
:允许你配置身份验证管理器,配置不同的身份验证提供者(例如,基于内存的、JDBC 或 LDAP 等身份验证机制)。
-
-
2.2.4 CSRF 和 CORS 配置:默认启用 CSRF 防护,支持跨域资源共享(CORS)。
- CSRF
-
CSRF(Cross-Site Request Forgery)防护: 默认情况下,Spring Security 启用 CSRF 防护,它通过要求每个请求带上一个特殊的令牌(token)来防止跨站请求伪造攻击(CSRF)。这对于 Web 应用尤其重要,可以防止恶意网站伪造用户请求。除非你有明确的理由,否则应避免禁用 CSRF 防护。
Spring Boot 自动配置会根据请求的类型(例如,POST 请求)自动为每个表单生成 CSRF token。如果你想禁用 CSRF(例如在开发 REST API 时),可以通过如下配置禁用 CSRF 防护:
-
@Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); // 禁用 CSRF 防护 }
-
-
CORS
-
CORS(Cross-Origin Resource Sharing)支持: 默认情况下,Spring Security 会启用对跨域资源共享(CORS)的支持。CORS 是一种机制,允许浏览器在一个域上运行的 Web 应用请求另一个域的资源。如果你有前后端分离的应用(前端和后端分别部署在不同的域),你可能需要配置 CORS 规则。
-
@Override protected void configure(HttpSecurity http) throws Exception { http.cors().and() // 启用 CORS .authorizeRequests() .anyRequest().authenticated(); }
-
- CSRF
-
-
3. Spring Security 配置
-
3.1 启用 Spring Security
-
Spring Security 提供了一种方便的方式来保护你的应用程序。在 Spring Boot 中,启用 Spring Security 是通过
@EnableWebSecurity
注解来完成的。你还可以通过继承WebSecurityConfigurerAdapter
类来定制安全配置。 -
@EnableWebSecurity @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin().permitAll(); http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated(); } }
-
3.1.1 @EnableWebSecurity 注解
-
@EnableWebSecurity
注解是 Spring Security 提供的,作用是启用 Web 安全功能,它会触发 Spring Security 的自动配置。 -
通常与
@Configuration
注解一起使用,表明该类是 Spring 配置类并启用 Spring Security 配置。
-
-
3.1.2 继承 WebSecurityConfigurerAdapter
-
WebSecurityConfigurerAdapter
是 Spring Security 提供的一个适配器类,它允许开发者定制 HTTP 请求安全配置。你只需要继承该类并重写其中的配置方法即可实现个性化的安全配置。 -
代码
-
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { // 配置 HTTP 请求的安全规则 @Override protected void configure(HttpSecurity http) throws Exception { // 启用表单登录,允许所有用户访问登录页面 http.formLogin().permitAll(); // 设定哪些路径可以公开访问,其他路径都需要认证 http.authorizeRequests() .antMatchers("/public/**").permitAll() // 公开路径 /public/** .anyRequest().authenticated(); // 其他请求需要认证 } }
-
-
http.formLogin().permitAll();
:启用表单登录,并允许所有用户访问登录页面。 -
http.authorizeRequests().antMatchers("/public/**").permitAll();
:公开路径/public/**
,允许任何用户访问。 -
http.anyRequest().authenticated();
:其他路径都需要身份验证。 -
http.csrf().disable(); // 禁用 CSRF 防护
-
http.httpBasic(); // 启用 HTTP Basic 认证
-
http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") // /admin/** 路径需要 ADMIN 角色 .antMatchers("/user/**").hasRole("USER"); // /user/** 路径需要 USER 角色
-
-
-
3.2 SecurityAutoConfiguration 解析
-
SecurityAutoConfiguration
是 Spring Boot 中的自动配置类,它帮助你快速启用和配置 Spring Security。如果你没有手动配置 Spring Security,Spring Boot 会自动应用该配置。 -
这两个类通常是一起工作的,
SecurityAutoConfiguration
提供了 Spring Boot 中的默认配置,而WebSecurityConfigurerAdapter
则是用来 覆盖和自定义 默认配置的。如果你没有自定义安全配置,那么SecurityAutoConfiguration
会为你提供默认的安全设置。如果你需要特定的安全需求(例如,禁用 CSRF、配置表单登录、使用 JWT 认证等),你可以继承WebSecurityConfigurerAdapter
并根据你的需求进行配置。 -
自动启用基于表单的登录、CSRF 防护等。
-
自动配置默认的内存用户,用户名为
user
,密码为随机生成。 -
启用会话管理、跨域配置等。
-
配置文件中的设置
-
修改默认的用户名和密码:
-
spring.security.user.name=admin spring.security.user.password=secret
-
-
禁用 CSRF 防护:
-
spring.security.csrf.enabled=false
-
-
-
-
3.3 默认安全配置与自定义
-
默认启用 HTTP 基本认证和表单登录。
-
Spring Boot 提供的自动配置(
SecurityAutoConfiguration
)会启用以下默认设置:-
默认身份验证方式: 启用内存用户存储,用户名
user
和随机密码。 -
默认 HTTP 认证: 启用 HTTP Basic 和表单登录认证。
-
默认的授权控制: 任何请求都需要认证。
-
CSRF 防护: 默认启用 CSRF 防护。
-
-
-
自定义配置:
-
当你需要更灵活的安全配置时,可以通过继承
WebSecurityConfigurerAdapter
来覆盖默认配置。常见的自定义配置包括:-
修改认证方式
-
可以通过
AuthenticationManagerBuilder
配置不同的身份验证方式(如 JDBC、LDAP 或自定义UserDetailsService
)。 -
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("admin").password(passwordEncoder().encode("password")).roles("ADMIN"); }
-
-
配置 URL 路径保护
-
你可以定义哪些路径是公开的,哪些路径需要身份验证。
-
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") // 只有 ADMIN 角色才能访问 /admin/** .antMatchers("/public/**").permitAll() // 公开路径可以直接访问 .anyRequest().authenticated(); // 其他路径需要认证 }
-
-
禁用默认的 CSRF 防护
-
@Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); // 禁用 CSRF 防护 }
-
-
自定义表单登录
-
@Override protected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage("/login") .permitAll() .defaultSuccessUrl("/home", true); }
-
-
自定义用户认证
-
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); }
-
-
-
-
-
4. 身份验证与授权
-
4.1 基于表单的身份验证 (Form Login)
- Spring Security 默认启用表单登录。开发者可定制登录页面、登录成功和失败页面:
-
http.formLogin().loginPage("/custom-login").permitAll();
-
4.2 HTTP Basic 认证
- 启用 HTTP 基本认证,用于 RESTful API 等应用:
-
http.httpBasic().disable(); // 禁用 HTTP Basic 认证
-
注意:HTTP Basic 认证的用户名和密码通过 HTTP 头部传输,因此需要使用 HTTPS 以确保安全。
-
4.3 LDAP 或数据库集成
-
LDAP 集成:通过
LdapAuthenticationProvider
支持 LDAP 用户验证。 -
数据库用户验证:实现
UserDetailsService
接口,从数据库加载用户信息。
-
-
4.4 基于角色的授权
- 通过
antMatchers
配置角色访问权限: -
http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN");
- 通过
-
-
5. 跨站请求伪造 (CSRF) 与 跨域资源共享 (CORS)
-
5.1 CSRF 防护
- Spring Security 默认启用 CSRF 防护,防止恶意用户伪造请求:
-
启用 CSRF:
http.csrf().enable();
-
禁用 CSRF:
http.csrf().disable();
-
5.2 CORS 配置
-
全局启用 CORS:
http.cors().configurationSource(corsConfigurationSource());
-
使用
@CrossOrigin
注解为特定接口启用 CORS。
-
-
-
6. 自定义认证与授权
-
6.1 创建自定义 UserDetailsService
- 实现
UserDetailsService
接口来自定义用户认证逻辑,并结合UserDetails
定义用户的角色与权限。
- 实现
-
6.2 JWT 无状态认证
- 通过 JWT 实现无状态的认证流程:
-
用户登录时,生成 JWT。
-
客户端在请求时附带 JWT。
-
服务器验证 JWT 后提取用户信息进行授权。
-
6.3 OAuth2 认证
- 支持 OAuth2 和 OpenID Connect,适用于第三方认证授权:
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency>
-
-
7. 安全性最佳实践
-
7.1 密码加密与存储
-
使用
BCryptPasswordEncoder
加密存储密码,避免明文存储。 -
密码验证时通过
PasswordEncoder
接口验证。
-
-
7.2 安全的 HTTP Headers 配置
- 启用安全 HTTP 头部,如 HSTS(HTTP Strict Transport Security)等,防止攻击:
-
http.headers().httpStrictTransportSecurity().maxAgeInSeconds(31536000).includeSubDomains(true);
-
7.3 防止常见安全漏洞
-
XSS:清理用户输入,避免不信任的 JavaScript 代码。
-
SQL 注入:使用 ORM 框架,避免直接拼接 SQL 字符串。
-
CSRF:启用 CSRF 防护,生成并验证 CSRF 令牌。
-
-
-
8. 集成其他 Spring Security 功能
-
8.1 OAuth2 集成
-
使用
spring-boot-starter-oauth2-client
实现 OAuth2 客户端功能。 -
使用
spring-boot-starter-oauth2-resource-server
实现 OAuth2 资源服务器功能。
-
-
8.2 Spring Session 集成
- 通过
spring-session
管理会话,支持集群环境下的会话共享。
- 通过
-
8.3 Spring Security 与 Actuator 结合
- 启用 Spring Boot Actuator 和 Spring Security,保护 Actuator 端点的安全。
-