Spring Security简介
2026/1/15大约 3 分钟SpringSpring SecurityJava安全认证授权
Spring Security简介
什么是 Spring Security
Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。它是保护基于 Spring 的应用程序的事实标准,提供了全面的安全解决方案。
核心概念
1. 认证(Authentication)
验证用户身份,确认"你是谁"。
// Authentication 接口
public interface Authentication extends Principal, Serializable {
Collection<? extends GrantedAuthority> getAuthorities(); // 权限
Object getCredentials(); // 凭证(密码)
Object getDetails(); // 详情
Object getPrincipal(); // 主体(用户)
boolean isAuthenticated();
}2. 授权(Authorization)
验证用户权限,确认"你能做什么"。
// GrantedAuthority 接口
public interface GrantedAuthority extends Serializable {
String getAuthority(); // 返回权限标识,如 "ROLE_ADMIN"
}3. 主体(Principal)
当前登录的用户。
4. 凭证(Credentials)
用于验证身份的信息,通常是密码。
核心组件
SecurityContextHolder
存储当前安全上下文,包含当前用户的认证信息。
// 获取当前用户
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
Collection<? extends GrantedAuthority> authorities = auth.getAuthorities();AuthenticationManager
认证管理器,负责处理认证请求。
public interface AuthenticationManager {
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
}UserDetailsService
加载用户信息的核心接口。
public interface UserDetailsService {
UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException;
}UserDetails
用户详情接口,包含用户名、密码、权限等信息。
public interface UserDetails extends Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}快速开始
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>默认行为
添加依赖后,Spring Security 会自动:
- 保护所有端点,要求认证
- 生成默认用户
user和随机密码(控制台输出) - 提供默认登录页面
/login - 启用 CSRF 保护
# 启动日志中会显示默认密码
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336基本配置
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll() // 公开访问
.requestMatchers("/admin/**").hasRole("ADMIN") // 需要 ADMIN 角色
.anyRequest().authenticated() // 其他需要认证
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页
.permitAll()
)
.logout(logout -> logout
.logoutSuccessUrl("/")
.permitAll()
);
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder().encode("admin"))
.roles("ADMIN", "USER")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}过滤器链
Spring Security 通过一系列过滤器处理请求:
主要过滤器:
| 过滤器 | 作用 |
|---|---|
| SecurityContextPersistenceFilter | 加载/保存 SecurityContext |
| UsernamePasswordAuthenticationFilter | 处理表单登录 |
| BasicAuthenticationFilter | 处理 HTTP Basic 认证 |
| BearerTokenAuthenticationFilter | 处理 JWT Token |
| ExceptionTranslationFilter | 处理安全异常 |
| FilterSecurityInterceptor | 授权决策 |
小结
Spring Security 是 Spring 生态中的安全框架,提供了认证、授权、防护等全面的安全功能。核心概念包括 Authentication、Authorization、Principal 等,通过过滤器链处理安全请求。
面试题预览
常见面试题
- Spring Security 的核心组件有哪些?
- Authentication 和 Authorization 有什么区别?
- Spring Security 的过滤器链是如何工作的?
