spring mvc需结合spring security实现注解级权限控制,通过@enableglobalmethodsecurity启用@preauthorize等注解,支持角色、权限、spel表达式及数据级校验,且仅对spring管理的public方法生效。

Spring MVC 本身不直接提供基于注解的权限控制能力,但可以结合 Spring Security 实现细粒度、声明式的注解级权限拦截(如 @PreAuthorize、@PostAuthorize、@Secured),这是目前最主流、最推荐的方式。
启用方法级安全控制
在配置类上添加 @EnableGlobalMethodSecurity 注解,并指定启用的注解类型:
-
prePostEnabled = true:启用@PreAuthorize和@PostAuthorize(支持 SpEL 表达式,最灵活) -
securedEnabled = true:启用@Secured(仅支持简单角色字符串,如@Secured("ROLE_ADMIN")) -
jsr250Enabled = true:启用@RolesAllowed等 JSR-250 标准注解
示例配置:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig {
// ... 配置 HttpSecurity 等
}
在 Controller 方法上使用权限注解
直接在处理方法或类上添加注解,无需修改业务逻辑代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
@PreAuthorize("hasRole('ADMIN')"):调用前校验是否拥有 ADMIN 角色(自动加前缀ROLE_) -
@PreAuthorize("hasAuthority('user:delete')"):校验是否具备指定权限(不加前缀,更适配 RBAC 细粒度控制) -
@PreAuthorize("#id == authentication.principal.id or hasRole('ADMIN')"):使用 SpEL 访问参数和认证信息,实现数据级权限(如“只能删自己的资源”) -
@PostAuthorize("returnObject.owner == authentication.name"):方法执行后校验返回值,适用于查询结果过滤
确保认证信息可访问
权限注解依赖 SecurityContext 中的 Authentication 对象。需保证:
- 用户已成功登录,且
Authentication已存入SecurityContextHolder - 自定义
UserDetailsService返回的UserDetails正确设置了getAuthorities()(即角色/权限列表) - 若使用 JWT 或无状态认证,需在过滤器中手动设置
SecurityContext
自定义注解(可选进阶)
可定义自己的权限注解(如 @RequirePermission("order:pay")),再通过 Aop 或 MethodSecurityMetadataSource 解析它,对接权限服务(如数据库查权限)。但多数场景下直接用 @PreAuthorize + SpEL 更简洁可靠。
不复杂但容易忽略的是:方法级注解只对 被 Spring 容器管理的 Bean 中的 public 方法 生效;私有方法、非 Bean 类、直接 new 出来的对象调用均无效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










