91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Security基于注解的接口角色訪問控制怎么實現

發布時間:2022-04-02 10:57:32 來源:億速云 閱讀:210 作者:iii 欄目:編程語言

本文小編為大家詳細介紹“Spring Security基于注解的接口角色訪問控制怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Spring Security基于注解的接口角色訪問控制怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

 Spring Security基于注解的接口角色訪問控制怎么實現

1. 前言

DEMO 獲取方式在文末。

2. Spring Security 方法安全

Spring Security 基于注解的安全認證是通過在相關的方法上進行安全注解標記來實現的。

2.1 開啟全局方法安全

我們可以在任何 @Configuration實例上使用 @EnableGlobalMethodSecurity 注解來啟用全局方法安全注解功能。該注解提供了三種不同的機制來實現同一種功能,所以我們單獨開一章進行探討。

3. @EnableGlobalMethodSecurity 注解

@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)   @Target(value = { java.lang.annotation.ElementType.TYPE })   @Documented   @Import({ GlobalMethodSecuritySelector.class })   @EnableGlobalAuthentication   @Configuration   public @interface EnableGlobalMethodSecurity {       /**        * 基于表達式進行方法訪問控制        */       boolean prePostEnabled() default false;       /**        * 基于 @Secured 注解        */       boolean securedEnabled() default false;       /**       * 基于 JSR-250 注解        */       boolean jsr250Enabled() default false;       boolean proxyTargetClass() default false;       int order() default Ordered.LOWEST_PRECEDENCE;   }

@EnableGlobalMethodSecurity 源碼中提供了 prePostEnabled 、securedEnabled 和 jsr250Enabled 三種方式。當你開啟全局基于注解的方法安全功能時,也就是使用 @EnableGlobalMethodSecurity 注解時我們需要選擇使用這三種的一種或者其中幾種。我們接下來將分別介紹它們。

4. 使用 prePostEnabled

如果你在 @EnableGlobalMethodSecurity 設置 prePostEnabled 為 true ,則開啟了基于表達式的方法安全控制。通過表達式運算結果的布爾值來決定是否可以訪問(true 開放, false 拒絕 )。

有時您可能需要執行開啟 prePostEnabled 復雜的操作。對于這些實例,您可以擴展 GlobalMethodSecurityConfiguration,確保子類上存在@EnableGlobalMethodSecurity(prePostEnabled = true) 。例如,如果要提供自定義 MethodSecurityExpressionHandler :

@EnableGlobalMethodSecurity(prePostEnabled = true)   public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {       @Override       protected MethodSecurityExpressionHandler createExpressionHandler() {           // ... create and return custom MethodSecurityExpressionHandler ...           return expressionHandler;       }   }

上面示例屬于高級操作,一般沒有必要。無論是否繼承GlobalMethodSecurityConfiguration 都將會開啟四個注解。 @PreAuthorize 和 @PostAuthorize 側重于方法調用的控制;而 @PreFilter 和 @PostFilter 側重于數據的控制。

4.1 @PreAuthorize

在標記的方法調用之前,通過表達式來計算是否可以授權訪問。接下來我來總結以下常用的表達式。

  •  基于 SecurityExpressionOperations 接口的表達式,也就是我們在上一文的 javaConfig 配置。示例: @PreAuthorize("hasRole('ADMIN')") 必須擁有 ROLE_ADMIN 角色。

  •  基于 UserDetails 的表達式,此表達式用以對當前用戶的一些額外的限定操作。示例:@PreAuthorize("principal.username.startsWith('Felordcn')") 用戶名開頭為 Felordcn 的用戶才能訪問。

  •  基于對入參的 SpEL表達式處理。 示例: @PreAuthorize("#id.equals(principal.username)") 入參 id 必須同當前的用戶名相同。

4.2 @PostAuthorize

在標記的方法調用之后,通過表達式來計算是否可以授權訪問。該注解是針對 @PreAuthorize 。區別在于先執行方法。而后進行表達式判斷。如果方法沒有返回值實際上等于開放權限控制;如果有返回值實際的結果是用戶操作成功但是得不到響應。

4.3 @PreFilter

基于方法入參相關的表達式,對入參進行過濾。分頁慎用!該過程發生在接口接收參數之前。 入參必須為 java.util.Collection 且支持 remove(Object) 的參數。如果有多個集合需要通過 filterTarget=<參數名> 來指定過濾的集合。內置保留名稱 filterObject 作為集合元素的操作名來進行評估過濾。

樣例:

// 入參為Collection<String> ids   測試數據 ["Felordcn","felord","jetty"]  // 過濾掉  felord jetty  為  Felordcn  @PreFilter(value = "filterObject.startsWith('F')",filterTarget = "ids")  // 如果 當前用戶持有 ROLE_AD 角色  參數都符合  否則 過濾掉不是 f 開頭的     // DEMO 用戶不持有 ROLE_AD 角色  故而 集合只剩下 felord  @PreFilter("hasRole('AD') or filterObject.startsWith('f')")

4.4 @PostFilter

和@PreFilter 不同的是, 基于返回值相關的表達式,對返回值進行過濾。分頁慎用!該過程發生接口進行數據返回之前。 

5. 使用 securedEnabled

如果你在 @EnableGlobalMethodSecurity 設置 securedEnabled 為 true ,就開啟了角色注解 @Secured ,該注解功能要簡單的多,默認情況下只能基于角色(默認需要帶前綴 ROLE_)集合來進行訪問控制決策。

該注解的機制是只要其聲明的角色集合(value)中包含當前用戶持有的任一角色就可以訪問。也就是 用戶的角色集合和 @Secured 注解的角色集合要存在非空的交集。 不支持使用 SpEL 表達式進行決策。

6. 使用 jsr250Enabled

啟用 JSR-250 安全控制注解,這屬于 JavaEE 的安全規范(現為 jakarta 項目)。一共有五個安全注解。如果你在 @EnableGlobalMethodSecurity 設置 jsr250Enabled 為 true ,就開啟了 JavaEE 安全注解中的以下三個:

  •  @DenyAll 拒絕所有的訪問

  •  @PermitAll 同意所有的訪問

  •  @RolesAllowed 用法和 5. 中的 @Secured 一樣。

讀到這里,這篇“Spring Security基于注解的接口角色訪問控制怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文化| 吉首市| 新宾| 和林格尔县| 沂水县| 无锡市| 南昌县| 长垣县| 海南省| 绍兴市| 藁城市| 洱源县| 依安县| 精河县| 太仓市| 中方县| 额敏县| 杭锦旗| 金溪县| 平乐县| 乌兰县| 阜城县| 扶余县| 县级市| 家居| 商南县| 喀什市| 辽阳市| 满洲里市| 七台河市| 兴隆县| 古浪县| 水富县| 枣庄市| 山阴县| 呈贡县| 北海市| 容城县| 延川县| 肥乡县| 始兴县|