Spring Security 全面解析:从核心概念到实战应用
一、Spring Security 简介
Spring Security 是 Spring 生态中企业级安全框架,提供完整的身份认证(Authentication)和授权(Authorization)解决方案,支持抵御 CSRF、XSS 等常见攻击。其核心优势在于模块化设计和高扩展性,适用于 Web 应用、RESTful API 及微服务架构。
二、核心组件与架构
- 核心架构图

图1:Spring Security 过滤器链处理流程
- 核心组件解析
| 组件 | 功能 | 关键接口/类 |
|---|---|---|
| 认证管理器 | 处理认证流程 | AuthenticationManager |
| 用户详情服务 | 加载用户信息 | UserDetailsService |
| 密码编码器 | 密码加密/验证 | BCryptPasswordEncoder |
| 安全上下文 | 存储认证信息 | SecurityContextHolder |
| 权限拦截器 | 方法级权限控制 | MethodSecurityInterceptor |
三、认证流程详解
-
表单登录认证流程

图2:表单认证时序图 -
关键代码实现
自定义用户服务(从数据库加载用户):
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) {
User user = userMapper.findByUsername(username);
return User.withUsername(user.getName())
.password(passwordEncoder.encode(user.getPassword()))
.roles("USER")
.build();
}
}
四、授权机制详解
- 权限配置方式
| 方式 | 适用场景 | 示例 |
|---|---|---|
| URL级授权 | 控制接口访问 | antMatchers("/admin/**").hasRole("ADMIN") |
| 方法级授权 | 精粒度控制 | @PreAuthorize("hasAuthority('EDIT')") |
| OAuth2 | 第三方登录 | @EnableOAuth2Sso |
- 方法级安全配置
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig {
@PreAuthorize("hasRole('ADMIN') OR #id == authentication.principal.id")
public User getUserById(Long id) {
// 业务逻辑
}
}
五、安全配置最佳实践
- 基础配置示例
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.requestMatchers("/api/**").authenticated()
.anyRequest().hasRole("USER"))
.formLogin(form -> form
.loginPage("/custom-login")
.defaultSuccessUrl("/dashboard"))
.logout(logout -> logout
.logoutSuccessUrl("/login?logout")
.invalidateHttpSession(true));
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
- CSRF 防护配置
http.csrf(csrf -> csrf
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringRequestMatchers("/api/public/**"));
六、高级功能
1. JWT 集成方案
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) {
String token = extractToken(request);
if (token != null && jwtUtil.validateToken(token)) {
Authentication auth = jwtUtil.getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);
}
filterChain.doFilter(request, response);
}
}
- OAuth2 资源服务器配置
@Configuration
@EnableResourceServer
public class ResourceServerConfig {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/**").authenticated()
.antMatchers("/actuator/**").permitAll();
}
}
七、常见问题解决方案
- 自定义登录页配置
<!-- login.html -->
<form th:action="@{/login}" method="post">
<input type="text" name="username"/>
<input type="password" name="password"/>
<button type="submit">登录</button>
</form>
- 会话固定攻击防护
http.sessionManagement(session -> session
.sessionFixation().migrateSession()
.maximumSessions(1)
.expiredUrl("/session-expired"));
八、架构演进路线


浙公网安备 33010602011771号