好的,阿杰 👍,我来给你系统讲一下 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 默认会:
    1. 所有接口都需要认证。
    2. 自动生成一个默认用户 user
    3. 控制台会打印随机密码(仅在启动时有效)。

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. 常见面试/实战问答

  1. Spring Security 默认用户是谁?
    → user,密码随机生成(控制台打印)。
  2. 如何存储用户信息?
    • 内存存储(测试)
    • 数据库存储(生产)
  3. Spring Security 如何防 CSRF?
    • 默认开启 CSRF 防护,POST 请求必须带 token。
  4. Spring Security 与 JWT 如何结合?
    • 常见做法:用 JWT 替代 Session,前后端分离必备。

👉 要不要我给你写一个 Spring Boot + Spring Security + JWT 前后端分离登录认证的完整示例代码?这样更贴近真实项目。