Spring Security 是一个强大的框架,用于保护 Spring 应用的安全。它提供了身份认证和授权功能。为了快速入门,以下是一些关键模块和类的介绍:
1. 核心模块
1.1. 认证 (Authentication)
认证模块负责验证用户的身份,确保用户是系统中的合法用户。
-
AuthenticationManager
:认证的核心接口,通常会使用它来处理认证请求。- 实现类:
ProviderManager
:常用的认证管理器,会通过多个AuthenticationProvider
来处理认证。
- 实现类:
-
AuthenticationProvider
:具体的认证处理器,用于验证用户的身份信息(如用户名、密码、JWT 等)。常见的实现有:DaoAuthenticationProvider
:处理基于数据库的认证,配合UserDetailsService
使用。JwtAuthenticationProvider
:处理基于 JWT 的认证。
-
SecurityContextHolder
:存储SecurityContext
,SecurityContext
持有当前经过认证的用户信息,即Authentication
对象。开发者可以从SecurityContextHolder
获取或设置当前用户的认证信息。
1.2. 授权模块(Authorization)
授权是在认证通过之后,决定用户是否有权访问某些资源的过程。在 Spring Security 5.5 之后,授权可以使用 AuthorizationManager 来实现,它比之前的 AccessDecisionManager 更加简洁和灵活。
AuthorizationManager
:处理授权决策的接口。
常见实现类:AuthenticatedAuthorizationManager
:确保用户已认证。AuthorityAuthorizationManager
:检查用户的角色或权限。WebExpressionAuthorizationManager
:使用表达式进行授权控制。
2. 关键配置类
2.1. SecurityConfigurerAdapter
这是 Spring Security 配置的基类,用来配置认证和授权的相关规则。常见的实现类有:
WebSecurityConfigurerAdapter
(Spring Security 5.7 之后被弃用):负责配置应用的安全机制。你可以继承它,重写configure(HttpSecurity http)
方法来自定义安全配置。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.logout();
}
}
2.2. HttpSecurity
负责基于 HTTP 请求的安全配置。常见的配置方法:
authorizeRequests()
:定义 URL 的访问权限控制。formLogin()
:启用基于表单的登录。httpBasic()
:启用 HTTP Basic 认证。logout()
:配置退出登录相关的设置。
3. 用户细节服务 (UserDetailsService)
UserDetailsService
:核心接口,用于加载用户的详细信息(通常从数据库加载)。UserDetails
:接口,表示用户的详细信息(如用户名、密码、权限等)。
@Service
public class MyUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 从数据库加载用户信息
return new User(username, password, authorities);
}
}
4. 过滤器 (Filters)
Spring Security 的过滤器链负责处理所有进入应用的 HTTP 请求。
UsernamePasswordAuthenticationFilter
:处理基于表单登录的认证。JwtAuthenticationFilter
:自定义的过滤器,用于处理 JWT 认证。
过滤器链会通过 SecurityFilterChain
进行配置。
5. 密码加密 (PasswordEncoder)
PasswordEncoder
:接口,用于处理密码的加密与匹配。BCryptPasswordEncoder
:常用的实现类,使用 BCrypt 加密算法。
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
6. 重要注解
@EnableWebSecurity
:启用 Spring Security 的 Web 安全功能,通常放在配置类上。@PreAuthorize
:方法级别的权限控制注解,确保某个方法只有特定角色或权限的用户可以访问。@PreAuthorize("hasRole('ADMIN')") public void adminOnlyMethod() { // 只有管理员能访问 }
7. Session 管理
SessionManagementConfigurer
:用于管理 Session 的行为,支持并发会话控制、Session 失效策略等。
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS); // 无状态的 Session 管理
8. 跨站请求伪造 (CSRF)
Spring Security 默认启用 CSRF 防护,确保表单提交的安全性。如果使用的是无状态的 API(如 REST API),可以禁用 CSRF:
http.csrf().disable();
总结
- 认证 (Authentication):通过
AuthenticationManager
和AuthenticationProvider
进行用户身份验证。 - 授权 (Authorization):使用
GrantedAuthority
和AccessDecisionManager
控制用户对资源的访问权限。 - 核心配置:
SecurityConfigurerAdapter
和HttpSecurity
用于配置应用的安全规则。 - 用户管理:
UserDetailsService
用于加载用户信息,配合PasswordEncoder
实现密码加密。 - 过滤器链:处理所有进入的请求,核心过滤器如
UsernamePasswordAuthenticationFilter
负责登录认证。
通过理解这些模块和类,你可以快速掌握 Spring Security 的使用,配置安全规则,保护应用的访问权限。