spring boot Security -----10

 

 

采用 Spring Boot 4 + Spring Security 7 最新写法,不用过时的 WebSecurityConfigurerAdapter,代码逐行带注释,复制到你的 jobportal 项目就能直接运行测试。

一、第一步:引入依赖

pom.xml 里新增安全框架依赖,仅此一个依赖即可开启全部安全功能
xml
 
 
<!-- Spring Security 安全框架 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

 

 
✅ 对应课程 108、110 集:只要引入这个依赖,零配置就会自动生效:
  • 所有接口必须登录才能访问
  • 自动生成默认登录页
  • 默认用户名:user,密码在项目启动控制台打印

二、第二步:完整自定义安全配置(核心文件)

新建 config/SecurityConfig.java,覆盖课程里所有核心知识点:内存用户、权限规则、关闭登录页、CSRF、CORS 跨域
java
 
运行
 
 
package com.example.jobportal.config;

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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import java.util.List;

@Configuration
@EnableWebSecurity // 开启Spring Security自定义配置
public class SecurityConfig {

    /**
     * 1. 核心安全过滤器链(所有规则都在这里配置)
     * 对应课程:111、112、113、114、115集
     */
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                // ========== 接口权限规则 ==========
                .authorizeHttpRequests(auth -> auth
                        // permitAll:所有人都能访问,不需要登录
                        .requestMatchers("/api/public/**").permitAll()
                        // denyAll:所有人都不能访问,直接拒绝
                        .requestMatchers("/api/secret/**").denyAll()
                        // hasRole:必须拥有指定角色才能访问
                        .requestMatchers("/api/admin/**").hasRole("ADMIN")
                        // 剩下所有接口:只要登录就能访问
                        .anyRequest().authenticated()
                )

                // ========== 关闭默认表单登录页(对应111集) ==========
                // 前后端分离项目不需要自带的登录页,直接关掉
                .formLogin(form -> form.disable())

                // ========== 关闭Basic Auth弹窗登录(对应111集) ==========
                .httpBasic(basic -> basic.disable())

                // ========== 关闭CSRF防护(对应112集) ==========
                // 前后端分离纯接口项目一般关闭,否则POST请求会403报错
                .csrf(csrf -> csrf.disable())

                // ========== 开启CORS跨域支持(对应115集) ==========
                .cors(cors -> cors.configurationSource(corsConfigurationSource()));

        return http.build();
    }

    /**
     * 2. 内存用户配置(对应109集)
     * 账号密码写在代码里,不用查数据库,入门学习用
     */
    @Bean
    public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
        // 普通用户
        UserDetails normalUser = User.withUsername("zhangsan")
                .password(passwordEncoder.encode("123456")) // 密码必须加密
                .roles("USER") // 角色:普通用户
                .build();

        // 管理员
        UserDetails adminUser = User.withUsername("admin")
                .password(passwordEncoder.encode("admin123"))
                .roles("ADMIN", "USER") // 同时拥有管理员+普通用户角色
                .build();

        // 把两个用户放进内存管理器
        return new InMemoryUserDetailsManager(normalUser, adminUser);
    }

    /**
     * 3. 密码加密器
     * Spring Security强制要求密码必须加密,用官方推荐的BCrypt算法
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * 4. 跨域配置(对应115集)
     * 允许前端页面从不同域名/端口调用后端接口
     */
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        // 允许所有来源(学习用,生产环境建议指定具体域名)
        config.setAllowedOriginPatterns(List.of("*"));
        // 允许所有请求头
        config.setAllowedHeaders(List.of("*"));
        // 允许所有请求方法 GET/POST/PUT/DELETE
        config.setAllowedMethods(List.of("*"));
        // 允许携带cookie
        config.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对所有接口生效
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}

 

 

三、第三步:写测试接口验证效果

新建 controller/SecurityTestController.java
java
 
运行
 
 
package com.example.jobportal.controller;

import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class SecurityTestController {

    // 公开接口:所有人都能访问
    @GetMapping("/public/hello")
    public String publicHello() {
        return "✅ 这是公开接口,任何人都能访问";
    }

    // 需要登录才能访问的接口
    @GetMapping("/user/info")
    public String userInfo(Authentication authentication) {
        // 获取当前登录的用户名
        String username = authentication.getName();
        return "👤 当前登录用户:" + username;
    }

    // 只有管理员才能访问
    @GetMapping("/admin/dashboard")
    public String adminDashboard() {
        return "🔐 管理员专属面板,只有ADMIN角色能进来";
    }

    // 被拒绝的接口
    @GetMapping("/secret/data")
    public String secretData() {
        return "❌ 你永远看不到这句话,因为denyAll会直接拒绝";
    }
}

 

 

四、测试方法 & 预期效果

1. 测试公开接口

浏览器直接访问:http://localhost:8080/api/public/hello
预期:直接返回内容,不需要登录 ✅ 对应 permitAll

2. 测试需要登录的接口

直接访问 http://localhost:8080/api/user/info
预期:返回 401/403,因为你没登录
登录方式:因为我们关掉了表单登录,用 Postman 测试最方便:
  • 请求方式:GET
  • 地址:http://localhost:8080/api/user/info
  • 选择 Authorization → Basic Auth
    • 用户名:zhangsan
    • 密码:123456
预期:成功返回当前登录用户名

3. 测试管理员权限接口

用普通用户 zhangsan 访问 /api/admin/dashboard
预期:403 无权限
换成管理员 admin / admin123 访问
预期:成功返回管理员面板内容

4. 测试 denyAll

访问 http://localhost:8080/api/secret/data
预期:无论登不登录,都直接 403 拒绝

五、课程知识点大白话对应

表格
 
课程集数核心内容通俗解释
108 初识 Spring Security 引入依赖就自动给所有接口加锁
109 静态内存用户 账号密码写死在代码里,不用数据库
110 零配置默认效果 什么都不配也能用,自带登录页、默认账号
111 关闭登录表单、Basic Auth 前后端分离项目不用自带登录页,手动关掉
112 permitAll /denyAll/ 关闭 CSRF 放行 / 拒绝接口;纯接口项目关 CSRF 防 403
113、114 自定义权限规则 自己规定哪些接口谁能访问
115 CORS 跨域配置 允许前端从不同端口调用后端
116~118 底层原理 & 执行流程 过滤器链的工作机制

六、底层原理通俗讲(对应 116~118 集)

Spring Security 的本质就是 「过滤器链」,可以理解成机场安检:
  1. 你的请求就像旅客,要进机场(访问接口)
  2. 进门要经过一道一道的安检关卡(一个个过滤器)
  3. 每一关检查不同内容:有没有登录、有没有权限、有没有 CSRF 令牌、跨域是否合法
  4. 任何一关不通过,直接拦下来返回 401/403
  5. 全部通过,才最终到达你的 Controller 接口
核心过滤器顺序:
 
跨域检查 → CSRF 检查 → 认证状态检查 → 权限校验 → ... → 接口执行
💡 我们上面配置的所有规则,最终都会变成一个个过滤器,按顺序组成一条链,请求必须挨个通过。

七、学习建议

  1. 先把上面代码跑通,观察每个接口的返回差异,理解权限规则
  2. 试着修改 authorizeHttpRequests 里的规则,看看效果变化
  3. 下一节课程会讲「数据库认证」,也就是把用户账号密码存在 MySQL 里,不用写死在代码里

 

 

 

posted @ 2026-08-01 01:19  漫漫长路</>  阅读(7)  评论(0)    收藏  举报