🔐 Spring Security 安全加固指南
安全是企业应用的生命线。本章节聚焦于 Spring Security 的实战配置与常见攻击防护。
🛂 认证与授权 (Authentication & Authorization)
JWT (JSON Web Token) 实战架构
对于前后端分离应用,推荐使用无状态的 JWT 认证模式。
- 登录: 用户提交账号密码 -> 服务端校验 -> 签发 JWT (包含 aud, exp, roles)。
- 访问: 客户端 Header
Authorization: Bearer <token>-> 过滤器JwtAuthenticationFilter解析 -> 存入SecurityContextHolder。 - 刷新: 双 Token 机制 (Access Token 短效 + Refresh Token 长效)。
RBAC 权限控制
启用方法级安全控制 @EnableMethodSecurity。
java
// 仅允许 ADMIN 角色访问
@PreAuthorize("hasRole('ADMIN')")
@PostMapping("/users")
public User createUser(@RequestBody User user) { ... }
// 允许当前用户或管理员修改密码
@PreAuthorize("hasRole('ADMIN') or #username == authentication.name")
public void changePassword(String username, String newPassword) { ... }🛡️ 常见 Web 攻击防护
| 攻击类型 | 防护手段 | Spring Security 配置 |
|---|---|---|
| CSRF (跨站请求伪造) | 使用 Token 验证;前后端分离且使用 Header 传输 Token 时可禁用 CSRF。 | .csrf(csrf -> csrf.disable()) (API场景) |
| XSS (跨站脚本攻击) | 输入过滤与输出转义;设置安全 Header。 | .headers(headers -> headers.contentSecurityPolicy(...)) |
| SQL 注入 | 严禁拼接 SQL;使用预编译语句 (PreparedStatement)。 | MyBatis 使用 #{param} 绑定变量,避免 ${param}。 |
📦 敏感数据保护
密码存储
决不能明文存储密码。使用 BCrypt 强哈希算法。
java
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}敏感配置脱敏
数据库密码、API Key 等不要硬编码在代码或 application.yml 中。
- 推荐: 使用环境变量、Vault 或 Jasypt 进行配置文件加密。
📜 审计日志
记录关键操作(登录、增删改)的 Who, When, What, Result。可以使用 Spring AOP 统一拦截记录。