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 博客