30个SpringSecurity注解:注解架构设计与应用详解(必须收藏)

30个SpringSecurity注解:注解架构设计与应用详解(必须收藏)

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 getData(@RequestHeader("X-Custom-Header") String customHeader) {

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 响应和缓存控制模块。

❈ ❈ ❈

相关文章

✧ ✧ ✧
小红书确认收货后多久到账?自动确认收货的期限是多久?买家卖家都要了解的小红书购物准则!
小熊猫香烟价格表
365bet体育

小熊猫香烟价格表

📅 07-04 👁️ 3018
夜探德阳繁华,揭秘璀璨星河下的夜场魅力与最新动态