您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“@EnableGlobalMethodSecurity注解怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“@EnableGlobalMethodSecurity注解怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
當我們想要開啟spring方法級安全時,只需要在任何 @Configuration實例上使用 @EnableGlobalMethodSecurity 注解就能達到此目的。
同時這個注解為我們提供了prePostEnabled 、securedEnabled 和 jsr250Enabled 三種不同的機制來實現同一種功能:
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(jsr250Enabled = true, prePostEnabled = true, securedEnabled = true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { }
prePostEnabled = true 會解鎖 @PreAuthorize 和 @PostAuthorize 兩個注解。
從名字就可以看出@PreAuthorize 注解會在方法執行前進行驗證,而 @PostAuthorize 注解會在方法執行后進行驗證。
public interface UserService { List<User> findAllUsers(); @PostAuthorize ("returnObject.type == authentication.name") User findById(int id); // @PreAuthorize("hasRole('ADMIN')") 必須擁有 ROLE_ADMIN 角色。 @PreAuthorize("hasRole('ROLE_ADMIN ')") void updateUser(User user); @PreAuthorize("hasRole('ADMIN') AND hasRole('DBA')") void deleteUser(int id); // @PreAuthorize("principal.username.startsWith('Felordcn')") 用戶名開頭為 Felordcn 的用戶才能訪問。 // @PreAuthorize("#id.equals(principal.username)") 入參 id 必須同當前的用戶名相同。 // @PreAuthorize("#id < 10") 限制只能查詢 id 小于 10 的用戶 }
常見內置表達式
@PostAuthorize:
該注解使用不多,在方法執行后再進行權限驗證。
適合驗證帶有返回值的權限。Spring EL 提供 返回對象能夠在表達式語言中獲取返回的對象returnObject。
區別在于先執行方法。而后進行表達式判斷。如果方法沒有返回值實際上等于開放權限控制;如果有返回值實際的結果是用戶操作成功但是得不到響應。
允許方法調用,但是如果表達式計算結果為false,將拋出一個安全性異常。
@PreFilter:
集合類型的參數執行過濾,移除結果為false的元素。
基于方法入參相關的表達式,對入參進行過濾。分頁慎用!該過程發生在接口接收參數之前。
入參必須為 java.util.Collection 且支持 remove(Object) 的參數。
如果有多個集合需要通過 filterTarget=<參數名> 來指定過濾的集合。
內置保留名稱 filterObject 作為集合元素的操作名來進行評估過濾。
// 指定過濾的參數,過濾偶數 @PreFilter(filterTarget="ids", value="filterObject%2==0") public void delete(List<Integer> ids, List<String> username)
@PostFilter:
和@PreFilter 不同的是, 基于返回值相關的表達式,對返回值進行過濾。
分頁慎用!該過程發生接口進行數據返回之前。
@Secured注解是用來定義業務方法的安全配置。
在需要安全[角色/權限等]的方法上指定 @Secured,并且只有那些角色/權限的用戶才可以調用該方法。
@Secured缺點(限制)就是不支持Spring EL表達式。不夠靈活。并且指定的角色必須以ROLE_開頭,不可省略。
該注解功能要簡單的多,默認情況下只能基于角色(默認需要帶前綴 ROLE_)集合來進行訪問控制決策。
該注解的機制是只要其聲明的角色集合(value)中包含當前用戶持有的任一角色就可以訪問。
也就是 用戶的角色集合和 @Secured 注解的角色集合要存在非空的交集。
不支持使用 SpEL 表達式進行決策。
@Secured({"ROLE_user"}) void updateUser(User user); @Secured({"ROLE_admin", "ROLE_user1"}) void updateUser();
啟用 JSR-250 安全控制注解,這屬于 JavaEE 的安全規范(現為 jakarta 項目)。一共有五個安全注解。
如果你在 @EnableGlobalMethodSecurity 設置 jsr250Enabled 為 true
就開啟了 JavaEE 安全注解中的以下三個:
1.@DenyAll: 拒絕所有訪問
2.@RolesAllowed({“USER”, “ADMIN”}): 該方法只要具有"USER", "ADMIN"任意一種權限就可以訪問。這里可以省略前綴ROLE_,實際的權限可能是ROLE_ADMIN
3.@PermitAll: 允許所有訪問
讀到這里,這篇“@EnableGlobalMethodSecurity注解怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。