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