Spring Security 通过一系列注解简化了安全配置,使得开发者能够以声明式的方式实现安全控制。这些注解包括用于启用安全特性的 @EnableWebSecurity 和 @EnableGlobalMethodSecurity,以及用于方法级别的安全控制,如 @PreAuthorize 和 @PostAuthorize。此外,@EnableOAuth2Client 和 @EnableOAuth2ResourceServer 等注解支持 OAuth2 认证和资源保护。这些注解共同构成了 Spring Security 的强大工具集,帮助开发者构建既安全又易于维护的应用程序。
肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注
欢迎 点赞,关注,评论。
关注公号Solomon肖哥弹架构获取更多精彩内容
历史热点文章
28个验证注解,通过业务案例让你精通Java数据校验(收藏篇)Java 8函数式编程全攻略:43种函数式业务代码实战案例解析(收藏版)69 个Spring mvc 全部注解:真实业务使用案例说明(必须收藏)24 个Spring bean 全部注解:真实业务使用案例说明(必须收藏)MySQL索引完全手册:真实业务图文讲解17种索引运用技巧(必须收藏)一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
Spring Security 应用层注解设计方案
Web Security Module: 负责 Web 应用的 URL 授权、表单登录、注销等。
@EnableWebSecurity: 启用 Web 安全配置。@EnableGlobalMethodSecurity: 启用全局方法安全配置。 Method Security Module: 负责方法级别的安全性控制。
@PreAuthorize, @PostAuthorize, @Secured, @RolesAllowed, 等: 控制方法的访问权限。 OAuth2 Module: 负责 OAuth2 客户端、单点登录、资源服务器和授权服务器的配置。
@EnableOAuth2Client, @EnableOAuth2Sso, @EnableOAuth2ResourceServer, @EnableOAuth2AuthorizationServer: 启用 OAuth2 相关支持。 Parameter Binding Module: 负责从 HTTP 请求中提取信息并绑定到方法参数。
@AuthenticationPrincipal, @CurrentSecurityContext, @RequestHeader, @CookieValue, @SessionAttribute: 绑定请求相关的数据。 Password Encoding Module: 负责密码的安全编码。
@PasswordEncode, @BCrypt: 指定密码编码方式。 Other Security Features: 负责其他安全特性,如缓存控制。
@NoCache: 用于防止安全决策结果被缓存。
Spring Security 注解分类:
1. 启用安全支持
@EnableWebSecurity: 用于启用 Spring Security 的 Web 安全支持,通常在配置类上使用,以激活基于方法的安全和其他 Web 安全特性。@EnableGlobalMethodSecurity: 用于启用全局方法安全性配置,允许在整个应用程序中使用 Spring Security 的方法安全注解。@EnableOAuth2Client: 用于启用 OAuth2 客户端支持,允许应用程序作为 OAuth2 客户端进行配置。@EnableOAuth2Sso: 用于启用 OAuth2 单点登录支持,允许应用程序参与单点登录流程。@EnableOAuth2ResourceServer: 用于启用 OAuth2 资源服务器支持,允许应用程序保护资源。@EnableOAuth2AuthorizationServer: 用于启用 OAuth2 授权服务器支持,允许应用程序充当授权服务器。
2. 方法安全性注解
@PreAuthorize: 用于方法级别的前置权限验证,基于 Spring Expression Language (SpEL) 表达式。@PostAuthorize: 用于方法级别的后置权限验证,基于 SpEL 表达式。@Secured: 用于 JSR-250 安全注解的前置权限验证。@RolesAllowed: 用于 JSR-250 安全注解的角色权限验证。@DenyAll: 用于拒绝所有用户的访问。@permitAll: 允许所有用户访问。@authenticated: 允许所有认证用户访问。@FullyAuthenticated: 允许所有非匿名用户访问。@HasAuthority: 允许具有特定权限的用户访问。@HasAnyAuthority: 允许具有任何指定权限之一的用户访问。@HasRole: 允许具有特定角色的用户访问。@HasAnyRole: 允许具有任何指定角色之一的用户访问。
3. 方法参数绑定
@AuthenticationPrincipal: 用于将当前认证主体绑定到方法参数。@CurrentSecurityContext: 用于将当前安全上下文绑定到方法参数。@RequestHeader: 用于提取 HTTP 请求头信息并绑定到方法参数。@CookieValue: 用于提取 HTTP 饼干信息并绑定到方法参数。@SessionAttribute: 用于从 HTTP 会话中提取属性值并绑定到方法参数。
4. 密码编码
@PasswordEncode: 用于指定密码需要进行编码的方式。@BCrypt: 用于指定使用 BCrypt 算法进行密码编码。
5. 其他
@NoCache: 用于防止 Spring Security 的某些安全决策结果被缓存。
Spring Security 注解详解:
1. 启用安全支持
1.1 @EnableWebSecurity
注解作用介绍
用于启用 Spring Security 的 Web 安全支持,通常在配置类上使用,以激活基于方法的安全和其他 Web 安全特性。
注解属性介绍
无特定属性。 注解业务案例
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin();
}
}
注解使用效果: 使用 @EnableWebSecurity 后,Spring Security 会激活 Web 安全支持,包括 URL 授权和表单登录。
1.2 @EnableGlobalMethodSecurity
注解作用介绍
用于启用全局方法安全性配置,允许在整个应用程序中使用 Spring Security 的方法安全注解。
注解属性介绍
prePostEnabled: 是否启用前置和后置权限注解。securedEnabled: 是否启用 @Secured 注解。 注解业务案例
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig {
}
注解使用效果 使用 @EnableGlobalMethodSecurity 后,应用程序可以在整个项目中使用 Spring Security 的方法安全注解。
1.3 @EnableOAuth2Client
注解作用介绍
用于启用 OAuth2 客户端支持,允许应用程序作为 OAuth2 客户端进行配置。
注解属性介绍
registration: 指定一个 ClientRegistration 的 Bean 名称,该 Bean 包含客户端的配置信息。client: 直接在注解中指定客户端的配置信息。 注解业务案例
@EnableOAuth2Client
@Configuration
public class OAuth2ClientConfig {
@Bean
public ClientRegistration myClientRegistration() {
return ClientRegistration.withRegistrationId("client-id")
.clientSecret("client-secret")
.authorizedGrantType(AuthorizedGrantType.AUTHORIZATION_CODE)
.redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}")
.scope("read", "write")
.authorizationUri("https://provider.com/oauth2/auth")
.tokenUri("https://provider.com/oauth2/token")
.userInfoUri("https://provider.com/userinfo")
.userNameAttributeName("user_name")
.build();
}
}
注解使用效果: 使用 @EnableOAuth2Client 后,应用程序可以配置为 OAuth2 客户端,允许使用 OAuth2 进行认证和授权。
1.4 @EnableOAuth2Sso
注解作用介绍
用于启用 OAuth2 单点登录支持,允许应用程序参与单点登录流程。
注解属性介绍
loginPath: 指定重定向到 OAuth2 认证提供者的路径。failureUrl: 指定认证失败后的重定向路径。 注解业务案例
@EnableOAuth2Sso
@Configuration
public class OAuth2SsoConfig {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.loginPath("/login")
.failureUrl("/login?error");
}
}
注解使用效果: 使用 @EnableOAuth2Sso 后,应用程序可以配置为参与 OAuth2 单点登录流程。
1.5 @EnableOAuth2ResourceServer
注解作用介绍
用于启用 OAuth2 资源服务器支持,允许应用程序保护资源。
注解属性介绍
jwt: 配置 JWT 资源服务器。opaqueToken: 配置不透明令牌资源服务器。 注解业务案例
@EnableOAuth2ResourceServer
@Configuration
public class OAuth2ResourceServerConfig {
@Bean
public ResourceServerProperties resourceServerProperties() {
ResourceServerProperties properties = new ResourceServerProperties();
properties.setJwt().decoder(new NimbusJwtDecoder(issuerUri));
return properties;
}
}
注解使用效果: 使用 @EnableOAuth2ResourceServer 后,应用程序可以配置为 OAuth2 资源服务器,保护应用程序资源。
1.6 @EnableOAuth2AuthorizationServer
注解作用介绍
用于启用 OAuth2 授权服务器支持,允许应用程序充当授权服务器。
注解属性介绍
authorizationCodeServices: 指定授权码服务的 Bean。tokenServices: 指定令牌服务的 Bean。 注解业务案例
@EnableOAuth2AuthorizationServer
@Configuration
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints
.authorizationCodeServices(new InMemoryAuthorizationCodeServices())
.tokenStore(tokenStore());
}
@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}
}
注解使用效果: 使用 @EnableOAuth2AuthorizationServer 后,应用程序可以配置为 OAuth2 授权服务器,管理客户端和授权流程。
2. 方法安全性注解
2.1 @PreAuthorize
注解作用介绍
用于方法级别的前置权限验证,基于 Spring Expression Language (SpEL) 表达式。
注解属性介绍
value: 定义一个 SpEL 表达式,用于确定是否有权限执行方法。 注解业务案例
public class UserService {
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(String userId) {
// 删除用户逻辑
}
}
注解使用效果: 使用 @PreAuthorize 后,只有具有 ADMIN 角色的用户才能调用 deleteUser 方法。
2.2 @PostAuthorize
注解作用介绍
用于方法级别的后置权限验证,基于 SpEL 表达式。
注解属性介绍
value: 定义一个 SpEL 表达式,用于在方法执行后确定是否有权限访问返回值。 注解业务案例
public class UserService {
@PostAuthorize("returnObject.username == authentication.principal.username")
public User getUser(String userId) {
return userRepository.findById(userId);
}
}
注解使用效果: 使用 @PostAuthorize 后,只有当返回的用户对象与当前认证用户的用户名相匹配时,才能访问 getUser 方法。
2.3 @Secured
注解作用介绍
用于 JSR-250 安全注解的前置权限验证。
注解属性介绍
value: 定义角色或权限,用于确定是否有权限执行方法。 注解业务案例
public class UserService {
@Secured("ROLE_ADMIN")
public void deleteUser(String userId) {
// 删除用户逻辑
}
}
注解使用效果: 使用 @Secured 后,只有具有 ROLE_ADMIN 权限的用户才能调用 deleteUser 方法。
2.4 @RolesAllowed
注解作用介绍
用于 JSR-250 安全注解的角色权限验证。
注解属性介绍
value: 定义角色列表,用于确定是否有权限执行方法。 注解业务案例
public class UserService {
@RolesAllowed("ADMIN")
public void deleteUser(String userId) {
// 删除用户逻辑
}
}
注解使用效果: 使用 @RolesAllowed 后,只有具有 ADMIN 角色的用户才能调用 deleteUser 方法。
2.5 @DenyAll
注解作用介绍
用于拒绝所有用户的访问。
注解属性介绍
无特定属性。 注解业务案例
public class UserService {
@DenyAll
public void deleteAllUsers() {
// 删除所有用户逻辑
}
}
注解使用效果: 使用 @DenyAll 后,任何用户都不能调用 deleteAllUsers 方法。
2.6 @permitAll
注解作用介绍
允许所有用户访问。
注解属性介绍
无特定属性。 注解业务案例
public class UserService {
@permitAll
public void listUsers() {
// 列出所有用户逻辑
}
}
注解使用效果: 使用 @permitAll 后,所有用户都可以调用 listUsers 方法。
2.7 @authenticated
注解作用介绍
允许所有认证用户访问。
注解属性介绍
无特定属性。 注解业务案例
public class UserService {
@authenticated
public User getCurrentUser() {
return userService.getCurrentUser();
}
}
注解使用效果: 使用 @authenticated 后,只有认证用户才能调用 getCurrentUser 方法。
2.8 @FullyAuthenticated
注解作用介绍
允许所有非匿名用户访问。
注解属性介绍
无特定属性。 注解业务案例
public class UserService {
@FullyAuthenticated
public void updateProfile(User user) {
// 更新用户资料逻辑
}
}
注解使用效果: 使用 @FullyAuthenticated 后,只有非匿名用户才能调用 updateProfile 方法。
2.9 @HasAuthority
注解作用介绍
允许具有特定权限的用户访问。
注解属性介绍
value: 定义权限,用于确定是否有权限执行方法。 注解业务案例
public class UserService {
@HasAuthority("PERMISSION_USER_DELETE")
public void deleteUser(String userId) {
// 删除用户逻辑
}
}
注解使用效果: 使用 @HasAuthority 后,只有具有 PERMISSION_USER_DELETE 权限的用户才能调用 deleteUser 方法。
2.10 @HasAnyAuthority
注解作用介绍
允许具有任何指定权限之一的用户访问。
注解属性介绍
value: 定义权限列表,用于确定是否有权限执行方法。 注解业务案例
public class UserService {
@HasAnyAuthority({"PERMISSION_USER_READ", "PERMISSION_USER_WRITE"})
public User getUser(String userId) {
return userRepository.findById(userId);
}
}
注解使用效果: 使用 @HasAnyAuthority 后,只有具有 PERMISSION_USER_READ 或 PERMISSION_USER_WRITE 权限之一的用户才能调用 getUser 方法。
2.11 @HasRole
注解作用介绍
允许具有特定角色的用户访问。
注解属性介绍
value: 定义角色,用于确定是否有权限执行方法。 注解业务案例
public class UserService {
@HasRole("ADMIN")
public void deleteUser(String userId) {
// 删除用户逻辑
}
}
注解使用效果: 使用 @HasRole 后,只有具有 ADMIN 角色的用户才能调用 deleteUser 方法。
2.12 @HasAnyRole
注解作用介绍
允许具有任何指定角色之一的用户访问。
注解属性介绍
value: 定义角色列表,用于确定是否有权限执行方法。 注解业务案例
public class UserService {
@HasAnyRole({"ADMIN", "MODERATOR"})
public void deleteUser(String userId) {
// 删除用户逻辑
}
}
注解使用效果: 使用 @HasAnyRole 后,只有具有 ADMIN 或 MODERATOR 角色之一的用户才能调用 deleteUser 方法。
3. 方法参数绑定
3.1 @AuthenticationPrincipal
注解作用介绍
用于将当前认证主体绑定到方法参数。
注解属性介绍
无特定属性。 注解业务案例
public class UserController {
@GetMapping("/profile")
public String getProfile(@AuthenticationPrincipal User user) {
return "Profile of " + user.getUsername();
}
}
注解使用效果: 使用 @AuthenticationPrincipal 后,方法 getProfile 将接收当前认证用户的 User 对象。
3.2 @CurrentSecurityContext
注解作用介绍
用于将当前安全上下文绑定到方法参数。
注解属性介绍
无特定属性。 注解业务案例
public class SecurityService {
@PreAuthorize("hasAuthority('PERMISSION_AUDIT')")
public void auditAction(@CurrentSecurityContext SecurityContext context) {
// 审计逻辑
}
}
注解使用效果: 使用 @CurrentSecurityContext 后,方法 auditAction 将接收当前安全上下文。
3.3 @RequestHeader
注解作用介绍:
用于提取 HTTP 请求头信息并绑定到方法参数。
注解属性介绍
value: 请求头的名称。defaultValue: 如果请求头不存在时的默认值。 注解业务案例
public class ApiController {
@GetMapping("/data")
public ResponseEntity
return ResponseEntity.ok().body("Custom Header: " + customHeader);
}
}
注解使用效果: 使用 @RequestHeader 后,方法 getData 将接收名为 X-Custom-Header 的请求头信息。
3.4 @CookieValue
注解作用介绍
用于提取 HTTP 饼干信息并绑定到方法参数。
注解属性介绍
value: Cookie 的名称。defaultValue: 如果 Cookie 不存在时的默认值。 注解业务案例
public class SessionController {
@GetMapping("/session-info")
public String getSessionInfo(@CookieValue("JSESSIONID") String sessionId) {
return "Session ID: " + sessionId;
}
}
注解使用效果: 使用 @CookieValue 后,方法 getSessionInfo 将接收名为 JSESSIONID 的 Cookie 信息。
3.5 @SessionAttribute
注解作用介绍
用于从 HTTP 会话中提取属性值并绑定到方法参数。
注解属性介绍
value: 会话属性的名称。defaultValue: 如果会话属性不存在时的默认值。 注解业务案例
public class SessionController {
@GetMapping("/session-attribute")
public String getSessionAttribute(@SessionAttribute("user") User user) {
return "User: " + user.getUsername();
}
}
注解使用效果: 使用 @SessionAttribute 后,方法 getSessionAttribute 将接收存储在会话中的 user 属性。
4. 密码编码
4.1 @PasswordEncode
注解作用介绍
用于指定密码需要进行编码的方式。@PasswordEncode 不是 Spring Security 或 Hutool 的标准注解。通常,我们会使用 Spring Security 提供的 PasswordEncoder 接口来处理密码编码
注解属性介绍
value: 指定密码编码器的 Bean 名称。 注解业务案例
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
注解使用效果: 使用 @PasswordEncode 后,配置类中定义了密码编码器为 BCryptPasswordEncoder。
4.2 @BCrypt
注解作用介绍
用于指定使用 BCrypt 算法进行密码编码。
注解属性介绍
无特定属性。 注解业务案例
@Service
public class UserService {
@BCrypt
public String encodePassword(String rawPassword) {
return new BCryptPasswordEncoder().encode(rawPassword);
}
}
注解使用效果: 使用 @BCrypt 后,方法 encodePassword 将使用 BCrypt 算法对密码进行编码。
5. 其他
5.1 @NoCache
注解作用介绍
用于防止 Spring Security 的某些安全决策结果被缓存。
注解属性介绍
无特定属性。 注解业务案例
public class SensitiveDataController {
@PreAuthorize("hasAuthority('PERMISSION_VIEW_SENSITIVE_DATA')")
@NoCache
@GetMapping("/sensitive-data")
public SensitiveData getSensitiveData() {
return sensitiveDataService.getData();
}
}
注解使用效果 使用 @NoCache 后,方法 getSensitiveData 的结果不会被缓存,确保每次访问都进行权限检查。
6、注解总结
Spring Security 注解及其在框架中的作用:
1. 配置和启用安全模块
@EnableWebSecurity: 这个注解用于启用 Spring Security 的 Web 安全支持,通常在配置类中使用,以激活基于方法的安全和其他 Web 安全特性。它作用于 Web 应用程序的安全配置模块。@EnableGlobalMethodSecurity: 用于启用全局方法安全性配置,允许在整个应用程序中使用 Spring Security 的方法安全注解。它作用于方法级别的安全性模块。@EnableOAuth2Client: 用于启用 OAuth2 客户端支持,允许应用程序作为 OAuth2 客户端进行配置。它作用于 OAuth2 客户端模块。@EnableOAuth2Sso: 用于启用 OAuth2 单点登录支持,允许应用程序参与单点登录流程。它作用于 OAuth2 SSO 模块。@EnableOAuth2ResourceServer: 用于启用 OAuth2 资源服务器支持,允许应用程序保护资源。它作用于 OAuth2 资源服务器模块。@EnableOAuth2AuthorizationServer: 用于启用 OAuth2 授权服务器支持,允许应用程序充当授权服务器。它作用于 OAuth2 授权服务器模块。
2. 方法安全性注解
@PreAuthorize, @PostAuthorize, @Secured, @RolesAllowed, @DenyAll, @permitAll, @authenticated, @FullyAuthenticated, @HasAuthority, @HasAnyAuthority, @HasRole, @HasAnyRole: 这些注解用于控制方法级别的安全性。它们作用于方法安全性模块,允许开发者基于不同的条件和表达式来限制对特定方法的访问。
3. 方法参数绑定
@AuthenticationPrincipal, @CurrentSecurityContext, @RequestHeader, @CookieValue, @SessionAttribute: 这些注解用于从 HTTP 请求中提取信息并将其绑定到方法参数。它们作用于请求处理模块,允许开发者方便地访问请求相关的数据。
4. 密码编码
@PasswordEncode: 这个注解(如果存在)可能用于标记密码字段,指示 Spring Security 在保存用户信息时需要对密码进行编码。它作用于用户认证和密码管理模块。
5. 其他
@NoCache: 用于防止 Spring Security 的某些安全决策结果被缓存。它作用于 HTTP 响应和缓存控制模块。