好的,阿杰 👍,我来给你系统讲一下 Spring Boot Security(Spring Security 在 Spring Boot 中的使用),方便你入门和实战。
🚀 Spring Boot Security 入门指南
1. 什么是 Spring Security?
- Spring Security 是 Spring 家族的安全框架,主要负责:
- 认证(Authentication) → 谁在访问系统?
- 授权(Authorization) → 有哪些权限?能访问哪些资源?
- 防护(Security) → 常见安全攻击(CSRF、Session Fixation、XSS、点击劫持等)。
相当于 Web 应用的安全大门。
2. Spring Boot 中的引入方式
在 pom.xml
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 引入后,Spring Boot 默认会:
- 所有接口都需要认证。
- 自动生成一个默认用户
user
。 - 控制台会打印随机密码(仅在启动时有效)。
3. 最基本的配置
3.1 自定义用户和密码
在 application.yml
中配置:
spring:
security:
user:
name: admin
password: 123456
登录时就可以用 admin / 123456
。
3.2 自定义安全配置类
在 Spring Boot 3.x 以后,推荐用 SecurityFilterChain 代替旧的 WebSecurityConfigurerAdapter
。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/public/**").permitAll() // 不需要登录
.anyRequest().authenticated() // 其他请求必须登录
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页
.permitAll()
)
.logout(logout -> logout.permitAll());
return http.build();
}
}
4. 用户与角色管理
4.1 内存中存储用户
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
public class UserConfig {
@Bean
public UserDetailsService userDetailsService() {
return new InMemoryUserDetailsManager(
User.withUsername("admin")
.password("{noop}123456") // {noop} 表示不加密
.roles("ADMIN")
.build(),
User.withUsername("user")
.password("{noop}123456")
.roles("USER")
.build()
);
}
}
4.2 数据库存储用户(实战常用)
一般会结合 Spring Data JPA + BCrypt 来存储用户和密码。
5. 常见功能
- 基于角色的访问控制
.authorizeHttpRequests(auth -> auth .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**").hasAnyRole("USER", "ADMIN") .anyRequest().authenticated() )
- 密码加密(推荐 BCrypt)
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
- 方法级别的权限控制
在类上加:@EnableMethodSecurity public class SecurityConfig { ... }
在方法上加:@PreAuthorize("hasRole('ADMIN')") public String adminOnly() { return "仅管理员可访问"; }
6. 常见面试/实战问答
- Spring Security 默认用户是谁?
→user
,密码随机生成(控制台打印)。 - 如何存储用户信息?
- 内存存储(测试)
- 数据库存储(生产)
- Spring Security 如何防 CSRF?
- 默认开启 CSRF 防护,POST 请求必须带 token。
- Spring Security 与 JWT 如何结合?
- 常见做法:用 JWT 替代 Session,前后端分离必备。
👉 要不要我给你写一个 Spring Boot + Spring Security + JWT 前后端分离登录认证的完整示例代码?这样更贴近真实项目。
发表回复