色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

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

瀏覽:51日期: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
相關文章:
主站蜘蛛池模板: 亚洲天堂网在线视频 | 99视频精品免视3 | 一级做a爰片性色毛片小说 一级做a爰片性色毛片中国 | 理论片亚洲| 99成人精品 | 久久免费精品国产72精品剧情 | 国产日韩久久久精品影院首页 | 国产va精品网站精品网站精品 | 老司机毛片| 国产精品理论 | 亚洲欧美日韩国产精品影院 | 日韩一级片在线播放 | 国产妇乱子伦视频免费 | 日本久久一区二区 | 日韩美香港a一级毛片 | 97在线观看免费版 | 久久一日本道色综合久久 | 香蕉视频亚洲一级 | 亚洲国产第一区二区香蕉日日 | 亚洲精品xxxx | 亚洲欧美一区二区三区在线 | 国产一级毛片免 | 好爽~好硬~好紧~蜜芽 | 国产精品一区二区三区高清在线 | 亚洲看片 | 精品国产一区在线观看 | 日韩中文字幕精品久久 | 久久精品国产99国产精品 | 天天视频一区二区三区 | 免费乱码中文字幕网站 | 久久成人18免费网站 | 在线日韩三级 | 成人18免费软件 | 国产精品揄拍一区二区久久 | 国产高清在线精品免费 | 国产精品情人露脸在线观看 | 老司机亚洲精品影院在线 | 中国女人毛片 | 久久精品国产屋 | 免费一级a毛片在线播放 | 日本加勒比在线视频 |