關(guān)于@EnableGlobalMethodSecurity注解的用法解讀
作用
當(dāng)我們想要開(kāi)啟spring方法級(jí)安全時(shí),只需要在任何 @Configuration實(shí)例上使用 @EnableGlobalMethodSecurity 注解就能達(dá)到此目的。
同時(shí)這個(gè)注解為我們提供了prePostEnabled 、securedEnabled 和 jsr250Enabled 三種不同的機(jī)制來(lái)實(shí)現(xiàn)同一種功能:
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(jsr250Enabled = true, prePostEnabled = true, securedEnabled = true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { }
prePostEnabled
prePostEnabled = true 會(huì)解鎖 @PreAuthorize 和 @PostAuthorize 兩個(gè)注解。
從名字就可以看出@PreAuthorize 注解會(huì)在方法執(zhí)行前進(jìn)行驗(yàn)證,而 @PostAuthorize 注解會(huì)在方法執(zhí)行后進(jìn)行驗(yàn)證。
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')") 用戶名開(kāi)頭為 Felordcn 的用戶才能訪問(wèn)。 // @PreAuthorize("#id.equals(principal.username)") 入?yún)?id 必須同當(dāng)前的用戶名相同。 // @PreAuthorize("#id < 10") 限制只能查詢 id 小于 10 的用戶 }
@PostAuthorize:
- 該注解使用不多,在方法執(zhí)行后再進(jìn)行權(quán)限驗(yàn)證。
- 適合驗(yàn)證帶有返回值的權(quán)限。Spring EL 提供 返回對(duì)象能夠在表達(dá)式語(yǔ)言中獲取返回的對(duì)象returnObject。
- 區(qū)別在于先執(zhí)行方法。而后進(jìn)行表達(dá)式判斷。如果方法沒(méi)有返回值實(shí)際上等于開(kāi)放權(quán)限控制;如果有返回值實(shí)際的結(jié)果是用戶操作成功但是得不到響應(yīng)。
- 允許方法調(diào)用,但是如果表達(dá)式計(jì)算結(jié)果為false,將拋出一個(gè)安全性異常。
@PreFilter:
- 集合類型的參數(shù)執(zhí)行過(guò)濾,移除結(jié)果為false的元素。
- 基于方法入?yún)⑾嚓P(guān)的表達(dá)式,對(duì)入?yún)⑦M(jìn)行過(guò)濾。分頁(yè)慎用!該過(guò)程發(fā)生在接口接收參數(shù)之前。
- 入?yún)⒈仨殲?java.util.Collection 且支持 remove(Object) 的參數(shù)。
- 如果有多個(gè)集合需要通過(guò) filterTarget=<參數(shù)名> 來(lái)指定過(guò)濾的集合。
- 內(nèi)置保留名稱 filterObject 作為集合元素的操作名來(lái)進(jìn)行評(píng)估過(guò)濾。
// 指定過(guò)濾的參數(shù),過(guò)濾偶數(shù) @PreFilter(filterTarget="ids", value="filterObject%2==0") public void delete(List<Integer> ids, List<String> username)
@PostFilter:
- 和@PreFilter 不同的是, 基于返回值相關(guān)的表達(dá)式,對(duì)返回值進(jìn)行過(guò)濾。
- 分頁(yè)慎用!該過(guò)程發(fā)生接口進(jìn)行數(shù)據(jù)返回之前。
Secured
@Secured注解是用來(lái)定義業(yè)務(wù)方法的安全配置。
在需要安全[角色/權(quán)限等]的方法上指定 @Secured,并且只有那些角色/權(quán)限的用戶才可以調(diào)用該方法。
@Secured缺點(diǎn)(限制)就是不支持Spring EL表達(dá)式。不夠靈活。并且指定的角色必須以ROLE_開(kāi)頭,不可省略。
該注解功能要簡(jiǎn)單的多,默認(rèn)情況下只能基于角色(默認(rèn)需要帶前綴 ROLE_)集合來(lái)進(jìn)行訪問(wèn)控制決策。
該注解的機(jī)制是只要其聲明的角色集合(value)中包含當(dāng)前用戶持有的任一角色就可以訪問(wèn)。
也就是 用戶的角色集合和 @Secured 注解的角色集合要存在非空的交集。
不支持使用 SpEL 表達(dá)式進(jìn)行決策。
@Secured({"ROLE_user"}) void updateUser(User user); @Secured({"ROLE_admin", "ROLE_user1"}) void updateUser();
jsr250E
啟用 JSR-250 安全控制注解,這屬于 JavaEE 的安全規(guī)范(現(xiàn)為 jakarta 項(xiàng)目)。一共有五個(gè)安全注解。
如果你在 @EnableGlobalMethodSecurity 設(shè)置 jsr250Enabled 為 true
就開(kāi)啟了 JavaEE 安全注解中的以下三個(gè):
1.@DenyAll: 拒絕所有訪問(wèn)
2.@RolesAllowed({“USER”, “ADMIN”}): 該方法只要具有"USER", "ADMIN"任意一種權(quán)限就可以訪問(wèn)。這里可以省略前綴ROLE_,實(shí)際的權(quán)限可能是ROLE_ADMIN
3.@PermitAll: 允許所有訪問(wèn)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)據(jù)開(kāi)發(fā)輔助工具Docker與普通程序使用方法
這是為數(shù)據(jù)開(kāi)發(fā)人員使用的輔助工具,用于數(shù)據(jù)庫(kù)之間的表同步,說(shuō)同步并不嚴(yán)謹(jǐn),因?yàn)椴皇菍?shí)時(shí)更新的,更確切的說(shuō)法是復(fù)制,可以方便的從一個(gè)數(shù)據(jù)庫(kù)復(fù)制表到另一個(gè)數(shù)據(jù)庫(kù),以下遇到同步的詞請(qǐng)理解為復(fù)制2021-09-09Java集合Map的clear與new Map區(qū)別詳解
這篇文章主要介紹了Java集合Map的clear與new Map區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04java中棧和隊(duì)列的實(shí)現(xiàn)和API的用法(詳解)
下面小編就為大家?guī)?lái)一篇java中棧和隊(duì)列的實(shí)現(xiàn)和API的用法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解
這篇文章主要介紹了SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解,在Springboot中定時(shí)任務(wù)是一項(xiàng)經(jīng)常能用到的功能,實(shí)現(xiàn)定時(shí)任務(wù)的方式有很多,今天來(lái)介紹常用的幾種,需要的朋友可以參考下2023-11-11使用Mybatis遇到的坑之Integer類型參數(shù)的解讀
這篇文章主要介紹了使用Mybatis遇到的坑之Integer類型參數(shù)的解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03老生常談設(shè)計(jì)模式之動(dòng)態(tài)代理
下面小編就為大家?guī)?lái)一篇老生常談設(shè)計(jì)模式之動(dòng)態(tài)代理。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06