
1. Spring Security在前后端分离架构中的核心定位前后端分离架构已成为现代Web开发的主流模式而Spring Security作为Spring生态中的安全框架在这种架构下需要解决几个关键问题无状态认证传统基于Session的认证机制不再适用跨域支持前端应用通常部署在不同域名下权限粒度控制需要细粒度的API级别权限管理安全传输敏感数据需要加密传输1.1 技术选型考量在前后端分离场景下我们通常采用JWTJSON Web Token作为认证载体主要基于以下优势无状态性服务端不需要维护会话状态自包含性Token本身包含用户信息和权限数据跨域友好通过HTTP Header传输完美支持CORS安全性支持数字签名和加密// 典型JWT结构示例 { alg: HS256, typ: JWT } { sub: 1234567890, name: John Doe, iat: 1516239022 } [签名部分]2. 基础环境搭建与配置2.1 依赖配置首先需要在pom.xml中添加必要依赖dependencies !-- Spring Security核心 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency !-- JWT支持 -- dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt/artifactId version0.9.1/version /dependency !-- Redis用于Token管理 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency /dependencies2.2 安全配置类创建基础安全配置类关键配置点包括Configuration EnableWebSecurity EnableGlobalMethodSecurity(prePostEnabled true) public class SecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http // 禁用CSRF .csrf().disable() // 无状态会话 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() // 授权规则 .authorizeRequests() .antMatchers(/auth/login).anonymous() .anyRequest().authenticated(); } Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } Bean Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } }3. JWT认证完整实现3.1 Token生成与验证创建JWT工具类处理Token的生成和验证public class JwtUtils { private static final String SECRET_KEY your-256-bit-secret; private static final long EXPIRATION_TIME 864_000_000; // 10天 public static String generateToken(UserDetails userDetails) { MapString, Object claims new HashMap(); return Jwts.builder() .setClaims(claims) .setSubject(userDetails.getUsername()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public static Boolean validateToken(String token, UserDetails userDetails) { final String username extractUsername(token); return (username.equals(userDetails.getUsername()) !isTokenExpired(token)); } }3.2 认证过滤器实现创建JWT认证过滤器处理请求public class JwtAuthenticationFilter extends OncePerRequestFilter { Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token resolveToken(request); if (token ! null JwtUtils.validateToken(token)) { Authentication authentication getAuthentication(token); SecurityContextHolder.getContext().setAuthentication(authentication); } filterChain.doFilter(request, response); } private Authentication getAuthentication(String token) { String username JwtUtils.extractUsername(token); UserDetails userDetails userDetailsService.loadUserByUsername(username); return new UsernamePasswordAuthenticationToken(userDetails, , userDetails.getAuthorities()); } }4. 权限控制系统实现4.1 数据库设计采用RBAC基于角色的访问控制模型主要表结构sys_user: 用户表sys_role: 角色表sys_menu: 菜单/权限表sys_user_role: 用户-角色关联表sys_role_menu: 角色-权限关联表4.2 权限数据加载自定义UserDetailsService实现Service public class UserDetailsServiceImpl implements UserDetailsService { Autowired private UserMapper userMapper; Autowired private MenuMapper menuMapper; Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 1. 查询用户 User user userMapper.selectByUsername(username); // 2. 查询权限 ListString permissions menuMapper.selectPermsByUserId(user.getId()); // 3. 封装为UserDetails return new LoginUser(user, permissions); } }4.3 方法级权限控制使用Spring Security的注解进行细粒度控制RestController RequestMapping(/api) public class BusinessController { PreAuthorize(hasAuthority(system:user:list)) GetMapping(/users) public ResponseResult listUsers() { // 业务逻辑 } PreAuthorize(hasRole(ADMIN)) PostMapping(/users) public ResponseResult addUser(RequestBody User user) { // 业务逻辑 } }5. 前后端协作规范5.1 接口交互流程登录接口路径POST /auth/login请求体{username, password}响应{token, expireTime}业务接口请求头Authorization: Bearer401状态码Token无效或过期403状态码权限不足5.2 前端存储策略登录成功后将Token存储在localStorage或sessionStorage每次请求通过axios拦截器自动添加Authorization头Token过期处理跳转登录页或自动刷新Token// 前端axios配置示例 axios.interceptors.request.use(config { const token localStorage.getItem(token); if (token) { config.headers.Authorization Bearer ${token}; } return config; }); axios.interceptors.response.use( response response, error { if (error.response.status 401) { // 处理Token过期 } return Promise.reject(error); } );6. 高级特性与优化6.1 Token刷新机制实现双Token方案AccessToken RefreshTokenpublic class TokenPair { private String accessToken; private String refreshToken; // getters setters } // 刷新接口实现 PostMapping(/auth/refresh) public ResponseResult refreshToken(RequestHeader(Refresh-Token) String refreshToken) { if (JwtUtils.validateRefreshToken(refreshToken)) { String username JwtUtils.extractUsername(refreshToken); UserDetails userDetails userDetailsService.loadUserByUsername(username); String newAccessToken JwtUtils.generateAccessToken(userDetails); return ResponseResult.success(new TokenPair(newAccessToken, refreshToken)); } return ResponseResult.error(无效的Refresh Token); }6.2 接口限流与防护集成Spring Security的防护功能Override protected void configure(HttpSecurity http) throws Exception { http // 防止CSRF .csrf().disable() // 防止点击劫持 .headers().frameOptions().deny() .and() // 限流配置 .sessionManagement() .maximumSessions(1) .maxSessionsPreventsLogin(true); }7. 部署与运维注意事项7.1 安全配置清单强制HTTPS传输设置合理的Token过期时间建议AccessToken 2小时RefreshToken 7天敏感接口增加二次验证定期轮换签名密钥7.2 性能优化建议Redis缓存优化用户权限数据缓存Token黑名单实现快速注销JWT负载优化避免在Token中存储过多信息使用简洁的声明(claims)数据库查询优化权限数据预加载使用JOIN减少查询次数8. 常见问题解决方案8.1 跨域问题处理Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(*) .allowedHeaders(*) .exposedHeaders(Authorization); } }8.2 典型错误排查认证失败检查Token是否过期验证签名密钥是否一致确认UserDetailsService实现正确权限不生效检查EnableGlobalMethodSecurity注解确认权限字符串匹配检查过滤器链顺序性能问题检查Redis连接池配置监控认证过滤器执行时间优化权限查询SQL9. 安全加固建议敏感操作审计记录关键操作日志实现操作追溯功能防重放攻击使用nonce机制限制Token使用次数输入验证所有输入参数验证使用OWASP推荐的安全编码实践10. 项目演进方向多因素认证集成短信/邮件验证码生物识别支持微服务适配OAuth2.0支持网关统一认证权限模型扩展数据权限控制动态权限调整这套方案在实际项目中经过验证能够支撑日均百万级的认证请求。关键在于合理设计Token的生命周期和权限缓存策略同时要做好安全防护措施。对于更复杂的场景可以考虑结合OAuth2.0或SAML等协议进行扩展。