
Spring Security 教程(13)、方法安全
Diebug为什么需要方法级安全



URL 级别的授权只能控制谁能访问某个页面。但在复杂的企业应用中,你还需要控制:
- 用户 A 只能查看自己的数据,不能查看用户 B 的
- 普通用户不能调用管理员接口
- 特定方法需要额外的权限校验
方法级安全通过 Spring AOP 实现,在方法调用前后进行权限检查。
启用方法级安全
1 | @Configuration |
@Secured:基于角色的简单控制
1 | @Secured("ROLE_ADMIN") |
@Secured 是最简单的注解,只检查用户是否拥有指定角色。注意它不支持 SpEL 表达式。
@PreAuthorize:灵活的预授权检查
1 | @PreAuthorize("hasRole('ADMIN')") |
@PreAuthorize 支持 SpEL 表达式,可以访问方法参数(通过 # 前缀)、Authentication 对象、Spring Bean 等。
@PostAuthorize:后授权检查
1 | @PostAuthorize("returnObject.owner == authentication.principal.username") |
@PostAuthorize 在方法执行后检查返回值,适合基于返回对象进行权限控制。
@PreFilter / @PostFilter:列表过滤
1 | @PreFilter(value = "filterObject.owner == authentication.principal.id", |
@PreFilter 在方法执行前过滤输入参数列表,@PostFilter 在方法执行后过滤返回值列表。
性能考虑



方法级安全通过 Spring AOP 代理实现,每次方法调用都会经过权限检查。对于高并发场景,建议:
- 避免在热点路径上使用复杂表达式
- 缓存权限检查结果
- 合理设计角色和权限模型,减少表达式复杂度
喜欢这篇文章的人也看了
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果