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.javajava
运行
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 的本质就是 「过滤器链」,可以理解成机场安检:
- 你的请求就像旅客,要进机场(访问接口)
- 进门要经过一道一道的安检关卡(一个个过滤器)
- 每一关检查不同内容:有没有登录、有没有权限、有没有 CSRF 令牌、跨域是否合法
- 任何一关不通过,直接拦下来返回 401/403
- 全部通过,才最终到达你的 Controller 接口
核心过滤器顺序:
跨域检查 → CSRF 检查 → 认证状态检查 → 权限校验 → ... → 接口执行
💡 我们上面配置的所有规则,最终都会变成一个个过滤器,按顺序组成一条链,请求必须挨个通过。
七、学习建议
- 先把上面代码跑通,观察每个接口的返回差异,理解权限规则
- 试着修改
authorizeHttpRequests里的规则,看看效果变化 - 下一节课程会讲「数据库认证」,也就是把用户账号密码存在 MySQL 里,不用写死在代码里

浙公网安备 33010602011771号