方法级权限控制-基于表达式操作
? Spring Security允許我們在定義URL訪問或方法訪問所應(yīng)有的權(quán)限時使用Spring EL表達(dá)式,在定義所需的訪問權(quán)限時如果對應(yīng)的表達(dá)式返回結(jié)果為true則表示擁有對應(yīng)的權(quán)限,反之則無。Spring Security可用表達(dá)式對象的基類是SecurityExpressionRoot,其為我們提供了如下在使用Spring EL表達(dá)式對URL或方法進(jìn)行權(quán)限控制時通用的內(nèi)置表達(dá)式。
| 表達(dá)式 | 描述 |
| hasRole([role]) | 當(dāng)前用戶是否擁有指定角色。 |
| hasAnyRole([role1,role2]) | 多個角色是一個以逗號進(jìn)行分隔的字符串。如果當(dāng)前用戶擁有指定角色中的任意一個則返回true。 |
| hasAuthority([auth]) | 等同于hasRole |
| hasAnyAuthority([auth1,auth2]) | 等同于hasAnyRole |
| Principle | 代表當(dāng)前用戶的principle對象 |
| authentication | 直接從SecurityContext獲取的當(dāng)前Authentication對象 |
| permitAll | 總是返回true,表示允許所有的 |
| denyAll | 總是返回false,表示拒絕所有的 |
| isAnonymous() | 當(dāng)前用戶是否是一個匿名用戶 |
| isRememberMe() | 表示當(dāng)前用戶是否是通過Remember-Me自動登錄的 |
| isAuthenticated() | 表示當(dāng)前用戶是否已經(jīng)登錄認(rèn)證成功了。 |
| isFullyAuthenticated() | 如果當(dāng)前用戶既不是一個匿名用戶,同時又不是通過Remember-Me自動登錄的,則返回true。 |
支持表達(dá)式的注解
@PreAuthorize 在方法調(diào)用之前,基于表達(dá)式的計算結(jié)果來限制對方法的訪問
示例: @PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)") void changePassword(@P("userId") long userId ){ } 這里表示在changePassword方法執(zhí)行之前,判斷方法參數(shù)userId的值是否等于principal中保存的當(dāng)前用戶的 userId,或者當(dāng)前用戶是否具有ROLE_ADMIN權(quán)限,兩種符合其一,就可以訪問該方法。@PostAuthorize 允許方法調(diào)用,但是如果表達(dá)式計算結(jié)果為false,將拋出一個安全性異常
示例: @PostAuthorize User getUser("returnObject.userId == authentication.principal.userId or hasPermission(returnObject, 'ADMIN')");@PostFilter 允許方法調(diào)用,但必須按照表達(dá)式來過濾方法的結(jié)果
@PreFilter 允許方法調(diào)用,但必須在進(jìn)入方法之前過濾輸入值
總結(jié)
以上是生活随笔為你收集整理的方法级权限控制-基于表达式操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 方法级权限控制-@Secured注解使用
- 下一篇: 页面端权限控制介绍