hasRole:
角色授权:授权代码,在我们返回的 UserDetails 的 Authority 需要加 ROLE_前缀,Controller 上使用时不要加前缀;
hasAuthority:
权限授权:用户自定义的权限,返回的 UserDetails 的 Authority 只要与这里匹配就可以,这里不需要加 ROLE_,名称保持一至即可
Spring Security 可用表达式对象的基类是 SecurityExpressionRoot,其为我们提供了如下在使用 Spring EL 表达式对 URL 或方法进行权限控制时通用的内置表达式:
表达式 | 说明 |
permitAll | 永远返回 true |
denyAll | 永远返回 false |
anonymous | 当前用户是 anonymous 时返回 true |
rememberMe | 当前用户是 rememberMe 用户时返回 true |
authenticated | 当前用户不是 anonymous 时返回 true |
fullAuthenticated | 当前用户既不是 anonymous 也不是 rememberMe 用户时返回 true |
hasRole(role) | 用户拥有指定的角色权限时返回 true |
hasAnyRole([role1,role2]) | 用户拥有任意一个指定的角色权限时返回 true |
hasAuthority(authority) | 用户拥有指定的权限时返回 true |
hasAnyAuthority([authority1,authority2]) | 用户拥有任意一个指定的权限时返回 true |
hasIpAddress('192.168.1.0') | 请求发送的 Ip 匹配时返回 true |
还可以在 WebSecurity 指定我们自己写的方法控制权限:
.access(“@MyRbacService.findAuthority(request,authentication)”)// 指定我们自己写的方法控制权限
扩展:
@PreAuthorize可以用来控制一个方法是否能够被调用。
@PostAuthorize是在方法调用完成后进行权限检查,它不能控制方法是否能被调用,只能在方法调用完成后检查权限决定是否要抛出
@PreFilter 和 @PostFilter 可以对集合类型的参数或返回值进行过滤。使用 @PreFilter 和 @PostFilter 时,Spring Security 将移除使对应表达式的结果为 false 的元素。
@PostFilter("filterObject.id%2==0")
public List<User> findAll() {
}
参考链接:https://www.baeldung.com/spring-security-expressions
Spring Security 中 @PreAuthorize、@PostAuthorize、@PreFilter 和 @PostFilter_起努力的博客 - CSDN 博客