亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Spring安全表達式控制系統功能訪問權限問題

發布時間:2021-09-28 11:34:08 來源:億速云 閱讀:124 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關如何使用Spring安全表達式控制系統功能訪問權限問題的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、SPEL表達式權限控制

從spring security 3.0開始已經可以使用spring Expression表達式來控制授權,允許在表達式中使用復雜的布爾邏輯來控制訪問的權限。Spring Security可用表達式對象的基類是SecurityExpressionRoot。

表達式函數描述
hasRole([role])用戶擁有指定的角色時返回true (Spring security默認會帶有ROLE_前綴),去除前綴參考Remove the ROLE_
hasAnyRole([role1,role2])用戶擁有任意一個指定的角色時返回true
hasAuthority([authority])擁有某資源的訪問權限時返回true
hasAnyAuthority([auth1,auth2])擁有某些資源其中部分資源的訪問權限時返回true
permitAll永遠返回true
denyAll永遠返回false
anonymous當前用戶是anonymous時返回true
rememberMe當前用戶是rememberMe用戶返回true
authentication當前登錄用戶的authentication對象
fullAuthenticated當前用戶既不是anonymous也不是rememberMe用戶時返回true
hasIpAddress('192.168.1.0/24'))請求發送的IP匹配時返回true

部分朋友可能會對Authority和Role有些混淆。Authority作為資源訪問權限可大可小,可以是某按鈕的訪問權限(如資源ID:biz1),也可以是某類用戶角色的訪問權限(如資源ID:ADMIN)。當Authority作為角色資源權限時,hasAuthority('ROLE_ADMIN')與hasRole('ADMIN')是一樣的效果。

二、SPEL在全局配置中的使用

我們可以通過繼承WebSecurityConfigurerAdapter,實現相關的配置方法,進行全局的安全配置(之前的章節已經講過) 。下面就為大家介紹一些如何在全局配置中使用SPEL表達式。

2.1.URL安全表達式

config.antMatchers("/system/*").access("hasAuthority('ADMIN') or hasAuthority('USER')")  .anyRequest().authenticated()

這里我們定義了應用/person/*URL的范圍,只有擁有ADMIN或者USER權限的用戶才能訪問這些person資源。

2.2.安全表達式中引用bean

這種方式,比較適合有復雜權限驗證邏輯的情況,當Spring Security提供的默認表達式方法無法滿足我們的需求的時候。首先我們定義一個權限驗證的RbacService。

@Component("rbacService")@Slf4jpublic class RbacService { //返回true表示驗證通過 public boolean hasPermission(HttpServletRequest request, Authentication authentication) {  //驗證邏輯代碼  return true; } public boolean checkUserId(Authentication authentication, int id) {  //驗證邏輯代碼  return true; }}

對于"/person/{id}"對應的資源的訪問,調用rbacService的bean的方法checkUserId進行權限驗證,傳遞參數為authentication對象和person的id。該id為PathVariable,以#開頭表示。

config.antMatchers("/person/{id}").access("@rbacService.checkUserId(authentication,#id)")  .anyRequest().access("@rbacService.hasPermission(request,authentication)");

三、 Method表達式安全控制

如果我們想實現方法級別的安全配置,Spring Security提供了四種注解,分別是@PreAuthorize , @PreFilter , @PostAuthorize 和 @PostFilter

3.1.開啟方法級別注解的配置

在Spring安全配置代碼中,加上EnableGlobalMethodSecurity注解,開啟方法級別安全配置功能。

@Configuration@EnableGlobalMethodSecurity(prePostEnabled = true)public class MySecurityConfig extends WebSecurityConfigurerAdapter {

3.2 使用PreAuthorize注解

@PreAuthorize 注解適合進入方法前的權限驗證。只有擁有ADMIN角色才能訪問findAll方法。

@PreAuthorize("hasRole('ADMIN')")List<Person> findAll();

3.3 使用PostAuthorize注解

@PostAuthorize 在方法執行后再進行權限驗證,適合根據返回值結果進行權限驗證。Spring EL 提供返回對象能夠在表達式語言中獲取返回的對象returnObject。下文代碼只有返回值的name等于authentication對象的name才能正確返回,否則拋出異常。

@PostAuthorize("returnObject.name == authentication.name")Person findOne(Integer id);

3.4 使用PreFilter注解

PreFilter 針對參數進行過濾,下文代碼表示針對ids參數進行過濾,只有id為偶數才能訪問delete方法。

//當有多個對象是使用filterTarget進行標注@PreFilter(filterTarget="ids", value="filterObject%2==0")public void delete(List<Integer> ids, List<String> usernames) {

3.5 使用PostFilter 注解

PostFilter 針對返回結果進行過濾,特別適用于集合類返回值,過濾集合中不符合表達式的對象。

@PostFilter("filterObject.name == authentication.name")List<Person> findAll();

感謝各位的閱讀!關于“如何使用Spring安全表達式控制系統功能訪問權限問題”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双江| 汨罗市| 石林| 洛浦县| 长治县| 永春县| 建阳市| 侯马市| 错那县| 庆安县| 泾阳县| 通城县| 棋牌| 宝鸡市| 德兴市| 连南| 峡江县| 古浪县| 永和县| 兰溪市| 浦北县| 安康市| 承德县| 阿拉善盟| 井冈山市| 信阳市| 江西省| 商丘市| 瑞昌市| 闸北区| 宁河县| 浏阳市| 怀仁县| 宜良县| 诸暨市| 吴忠市| 当阳市| 河北省| 聊城市| 永靖县| 阜城县|