Spring Security 教程(20)、方法安全

SpEL 表达式基础

Spring Security 配图
Spring Security 配图
Spring Security 配图

@PreAuthorize 和 @PostAuthorize 支持 Spring Expression Language(SpEL),可以编写复杂的权限表达式。

访问 Authentication 对象

1
2
3
4
5
6
7
8
@PreAuthorize("authentication.principal.username == 'admin'")
public void adminOnlyOperation() { ... }

@PreAuthorize("authentication.isAuthenticated()")
public void authenticatedOnly() { ... }

@PreAuthorize("hasRole('ADMIN') and authentication.isAuthenticated()")
public void adminAuthenticated() { ... }

访问方法参数

方法参数通过 # 前缀访问:

1
2
3
4
5
6
7
8
@PreAuthorize("#userId == authentication.principal.id")
public User getUserById(Long userId) { ... }

@PreAuthorize("#account.owner == authentication.principal")
public void updateAccount(Account account) { ... }

@PreAuthorize("hasRole('ADMIN') or #userId == authentication.principal.id")
public void accessUser(Long userId) { ... }

访问 Spring Bean

1
2
3
4
5
@PreAuthorize("@permissionService.hasPermission(#resourceId, 'READ')")
public Resource getResource(Long resourceId) { ... }

@PreAuthorize("@roleService.isAdmin()")
public List<User> getAllUsers() { ... }

通过 @Bean 名称引用 Spring 容器中的 Bean,调用其方法。

返回对象访问(@PostAuthorize)

1
2
@PostAuthorize("returnObject.owner == authentication.principal.username")
public User getUnsafeUser(Long userId) { ... }

方法执行后检查返回值,如果表达式为 false 则抛出 AccessDeniedException。

集合过滤(@PreFilter / @PostFilter)

1
2
3
4
5
6
@PreFilter(value = "filterObject.active == true", 
filterTarget = "users")
public User getUser(List<User> users, Long userId) { ... }

@PostFilter("filterObject.department == authentication.principal.department")
public List<User> getDepartmentUsers() { ... }

filterObject 代表集合中的每个元素,filterTarget 指定要过滤的目标参数。

常用表达式函数

method-security-2 配图
method-security 配图
method-security-2 配图

函数 说明
hasRole(role) 检查角色(自动加 ROLE_ 前缀)
hasAnyRole(roles) 检查任意角色
hasAuthority(authority) 检查权限
hasAnyAuthority(authorities) 检查任意权限
isAuthenticated() 是否已认证
isAnonymous() 是否匿名
isRememberMe() 是否 Remember-Me 认证
isFullyAuthenticated() 是否完全认证(非匿名、非 Remember-Me)
Authentication 当前认证对象
SecurityContextHolder 安全上下文工具类