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