
Spring Security 教程(20)、方法安全
DiebugSpEL 表达式基础



@PreAuthorize 和 @PostAuthorize 支持 Spring Expression Language(SpEL),可以编写复杂的权限表达式。
访问 Authentication 对象
1 | @PreAuthorize("authentication.principal.username == 'admin'") |
访问方法参数
方法参数通过 # 前缀访问:
1 | @PreAuthorize("#userId == authentication.principal.id") |
访问 Spring Bean
1 | @PreAuthorize("@permissionService.hasPermission(#resourceId, 'READ')") |
通过 @Bean 名称引用 Spring 容器中的 Bean,调用其方法。
返回对象访问(@PostAuthorize)
1 | @PostAuthorize("returnObject.owner == authentication.principal.username") |
方法执行后检查返回值,如果表达式为 false 则抛出 AccessDeniedException。
集合过滤(@PreFilter / @PostFilter)
1 | @PreFilter(value = "filterObject.active == true", |
filterObject 代表集合中的每个元素,filterTarget 指定要过滤的目标参数。
常用表达式函数



| 函数 | 说明 |
|---|---|
hasRole(role) |
检查角色(自动加 ROLE_ 前缀) |
hasAnyRole(roles) |
检查任意角色 |
hasAuthority(authority) |
检查权限 |
hasAnyAuthority(authorities) |
检查任意权限 |
isAuthenticated() |
是否已认证 |
isAnonymous() |
是否匿名 |
isRememberMe() |
是否 Remember-Me 认证 |
isFullyAuthenticated() |
是否完全认证(非匿名、非 Remember-Me) |
Authentication |
当前认证对象 |
SecurityContextHolder |
安全上下文工具类 |
喜欢这篇文章的人也看了
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果