国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

瀏覽:30日期: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爰片久久毛片唾 | 久草在线视频免费看 | 欧美一级成人一区二区三区 | 日韩免费在线视频 | 亚洲理论在线观看 | 九草在线播放 | 香蕉超级碰碰碰97视频在线观看 | 在线亚洲精品中文字幕美乳 | 免费a网址 | 国产伦精品一区二区三区无广告 | 韩国日本三级在线观看 | 富二代精品视频 | 国产午夜精品久久理论片 | 99在线热视频只有精品免费 | 国内成人免费视频 | www成人免费视频 | 亚洲精品日本高清中文字幕 | 国内精品久久久久久久久蜜桃 | 国产精品日产三级在线观看 | 中文字幕亚洲一区二区三区 | 国产在线观看一区二区三区 | 久色视频 | 欧美日a| 国内精品伊人久久久久妇 | 成人高清视频免费观看 | 67194午夜| 日韩视频精品在线 | 欧美成人另类69 | 一级a做爰片欧欧美毛片4 | 精品少妇一区二区三区视频 | 久久思| 18在线观看国内精品视频 | 久久中文字幕免费视频 | 国语自产拍天天在线 | 久艹视频在线观看 | 免费观看欧美一级牲片一 | 久久99精品久久久久久秒播放器 | 一本色道久久88综合亚洲精品高清 |