网站首页 > 技术文章 正文
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<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 响应和缓存控制模块。
猜你喜欢
- 2024-09-25 SpringBoot集成Spring Security入门体验
- 2024-09-25 Spring Boot Actuator的端点都怎么用?咱用事实说话
- 2024-09-25 Spring Security-2-表单认证 spring security关闭表单登陆
- 2024-09-25 自营性电商项目④ 自营式电商平台的主要优势在于
- 2024-09-25 微服务架构系列之–前后端分离 JWT认证机制
- 2024-09-25 SpringBoot整合SpringSecurity和JWT实现mymes认证和授权(一)
- 2024-09-25 跟我学spring security系列文章第一章 实现一个基本的登入
- 2024-09-25 SpringBoot集成Spring Security springboot集成Elasticsearch
- 2024-09-25 Spring Security身份验证详细介绍
- 2024-09-25 如何使用JWT和Spring Security保护REST API,你会多少?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)