Skip to content

🔐 Spring Security 安全加固指南

安全是企业应用的生命线。本章节聚焦于 Spring Security 的实战配置与常见攻击防护。

🛂 认证与授权 (Authentication & Authorization)

JWT (JSON Web Token) 实战架构

对于前后端分离应用,推荐使用无状态的 JWT 认证模式。

  1. 登录: 用户提交账号密码 -> 服务端校验 -> 签发 JWT (包含 aud, exp, roles)。
  2. 访问: 客户端 Header Authorization: Bearer <token> -> 过滤器 JwtAuthenticationFilter 解析 -> 存入 SecurityContextHolder
  3. 刷新: 双 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 统一拦截记录。

最后更新于: