Spring Security - @PreAuthorize安全表达式hasRole、hasAuthority区别

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_起努力的博客-优快云博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值