亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

詳解Spring Security 中的四種權限控制方式

瀏覽:29日期:2023-08-07 11:06:02

Spring Security 中對于權限控制默認已經提供了很多了,但是,一個優秀的框架必須具備良好的擴展性,恰好,Spring Security 的擴展性就非常棒,我們既可以使用 Spring Security 提供的方式做授權,也可以自定義授權邏輯。一句話,你想怎么玩都可以!

今天松哥來和大家介紹一下 Spring Security 中四種常見的權限控制方式。

表達式控制 URL 路徑權限 表達式控制方法權限 使用過濾注解 動態權限

四種方式,我們分別來看。

1.表達式控制 URL 路徑權限

首先我們來看第一種,就是通過表達式控制 URL 路徑權限,這種方式松哥在之前的文章中實際上和大家講過,這里我們再來稍微復習一下。

Spring Security 支持在 URL 和方法權限控制時使用 SpEL 表達式,如果表達式返回值為 true 則表示需要對應的權限,否則表示不需要對應的權限。提供表達式的類是 SecurityExpressionRoot:

詳解Spring Security 中的四種權限控制方式

可以看到,SecurityExpressionRoot 有兩個實現類,表示在應對 URL 權限控制和應對方法權限控制時,分別對 SpEL 所做的拓展,例如在基于 URL 路徑做權限控制時,增加了 hasIpAddress 選項。

我們來看下 SecurityExpressionRoot 類中定義的最基本的 SpEL 有哪些:

詳解Spring Security 中的四種權限控制方式

可以看到,這些都是該類對應的表達式,這些表達式我來給大家稍微解釋下:

表達式 備注 hasRole 用戶具備某個角色即可訪問資源 hasAnyRole 用戶具備多個角色中的任意一個即可訪問資源 hasAuthority 類似于 hasRole hasAnyAuthority 類似于 hasAnyRole permitAll 統統允許訪問 denyAll 統統拒絕訪問 isAnonymous 判斷是否匿名用戶 isAuthenticated 判斷是否認證成功 isRememberMe 判斷是否通過記住我登錄的 isFullyAuthenticated 判斷是否用戶名/密碼登錄的 principle 當前用戶 authentication 從 SecurityContext 中提取出來的用戶對象

這是最基本的,在它的繼承類中,還有做一些拓展,我這個我就不重復介紹了。

如果是通過 URL 進行權限控制,那么我們只需要按照如下方式配置即可:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers('/admin/**').hasRole('admin') .antMatchers('/user/**').hasAnyRole('admin', 'user') .anyRequest().authenticated() .and() ...}

這里表示訪問 /admin/** 格式的路徑需要 admin 角色,訪問 /user/** 格式的路徑需要 admin 或者 user 角色。

2.表達式控制方法權限

當然,我們也可以通過在方法上添加注解來控制權限。

在方法上添加注解控制權限,需要我們首先開啟注解的使用,在 Spring Security 配置類上添加如下內容:

@Configuration@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)public class SecurityConfig extends WebSecurityConfigurerAdapter { ... ...}

這個配置開啟了三個注解,分別是:

@PreAuthorize:方法執行前進行權限檢查 @PostAuthorize:方法執行后進行權限檢查 @Secured:類似于 @PreAuthorize

這三個結合 SpEL 之后,用法非常靈活,這里和大家稍微分享幾個 Demo。

@Servicepublic class HelloService { @PreAuthorize('principal.username.equals(’javaboy’)') public String hello() { return 'hello'; } @PreAuthorize('hasRole(’admin’)') public String admin() { return 'admin'; } @Secured({'ROLE_user'}) public String user() { return 'user'; } @PreAuthorize('#age>98') public String getAge(Integer age) { return String.valueOf(age); }} 第一個 hello 方法,注解的約束是,只有當前登錄用戶名為 javaboy 的用戶才可以訪問該方法。 第二個 admin 方法,表示訪問該方法的用戶必須具備 admin 角色。 第三個 user 方法,表示方法該方法的用戶必須具備 user 角色,但是注意 user 角色需要加上 ROLE_ 前綴。第四個 getAge 方法,表示訪問該方法的 age 參數必須大于 98,否則請求不予通過。

可以看到,這里的表達式還是非常豐富,如果想引用方法的參數,前面加上一個 # 即可,既可以引用基本類型的參數,也可以引用對象參數。

缺省對象除了 principal ,還有 authentication(參考第一小節)。

3.使用過濾注解

Spring Security 中還有兩個過濾函數 @PreFilter 和 @PostFilter,可以根據給出的條件,自動移除集合中的元素。

@PostFilter('filterObject.lastIndexOf(’2’)!=-1')public List<String> getAllUser() { List<String> users = new ArrayList<>(); for (int i = 0; i < 10; i++) { users.add('javaboy:' + i); } return users;}@PreFilter(filterTarget = 'ages',value = 'filterObject%2==0')public void getAllAge(List<Integer> ages,List<String> users) { System.out.println('ages = ' + ages); System.out.println('users = ' + users);} 在 getAllUser 方法中,對集合進行過濾,只返回后綴為 2 的元素,filterObject 表示要過濾的元素對象。 在 getAllAge 方法中,由于有兩個集合,因此使用 filterTarget 指定過濾對象。

4.動態權限

動態權限主要通過重寫攔截器和決策器來實現,這個我在 vhr 的文檔中有過詳細介紹,大家在公眾號【江南一點雨】后臺回復 888 可以獲取文檔,我就不再贅述了。

5.小結

好啦,今天就喝小伙伴們稍微聊了一下 Spring Security 中的授權問題,當然這里還有很多細節,后面松哥再和大家一一細聊。

到此這篇關于詳解Spring Security 中的四種權限控制方式的文章就介紹到這了,更多相關Spring Security 權限控制內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 欧美日韩亚洲另类人人澡 | 久久免费视频在线 | 免费看a | 久久99热不卡精品免费观看 | 又硬又大又湿又紧a视频 | 免费一级毛片在播放视频 | 91在线网站 | 免费观看性生交大片人 | 黄色小毛片 | 男女无遮挡边做边吃视频免费 | 亚洲精品综合久久 | 久久99精品久久久久久 | 成人免费看黄 | 久久厕所精品国产精品亚洲 | 快射视频欧美 | 国产三级精品美女三级 | 国产成人免费网站在线观看 | 黄色一级片观看 | 色系视频在线观看免费观看 | 美女被免费网站91 | 九九精品视频一区在线 | 九九精品视频在线观看九九 | 久久婷婷网| 国产永久免费视频m3u8 | 尤物在线播放 | a级毛片免费观看在线播放 a级毛片免费观看网站 | 青青久久久国产线免观 | 91午夜精品亚洲一区二区三区 | 91尤物国产尤物福利 | 一级特黄aa大片一又好看 | 欧美亚洲另类综合 | 香蕉亚洲 | 久久久久久久久免费视频 | 未满十八18周岁禁止免费国产 | 欧美日韩高清性色生活片 | 国内精品不卡一区二区三区 | 在线免费污视频 | 午夜性视频 | 国产永久免费高清在线观看视频 | 亚洲狼人香蕉香蕉在线28 | 日韩高清一区二区 |