计算机系统应用教程网站

网站首页 > 技术文章 正文

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

btikc 2024-09-25 15:17:26 技术文章 22 ℃ 0 评论

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_READPERMISSION_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 后,只有具有 ADMINMODERATOR 角色之一的用户才能调用 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<Object> 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 响应和缓存控制模块。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表