成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

使用Spring安全表達式控制系統(tǒng)功能訪問權限問題

一、SPEL表達式權限控制

創(chuàng)新互聯(lián)公司服務項目包括丹棱網(wǎng)站建設、丹棱網(wǎng)站制作、丹棱網(wǎng)頁制作以及丹棱網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,丹棱網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到丹棱省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

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

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

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

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

我們可以通過繼承WebSecurityConfigurerAdapter,實現(xiàn)相關的配置方法,進行全局的安全配置(之前的章節(jié)已經(jīng)講過) 。下面就為大家介紹一些如何在全局配置中使用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")
@Slf4j
public class RbacService {
 //返回true表示驗證通過
 public boolean hasPermission(HttpServletRequest request, Authentication authentication) {
  //驗證邏輯代碼
  return true;
 }
 public boolean checkUserId(Authentication authentication, int id) {
  //驗證邏輯代碼
  return true;
 }
}

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

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

三、 Method表達式安全控制

如果我們想實現(xiàn)方法級別的安全配置,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 在方法執(zhí)行后再進行權限驗證,適合根據(jù)返回值結(jié)果進行權限驗證。Spring EL 提供返回對象能夠在表達式語言中獲取返回的對象returnObject。下文代碼只有返回值的name等于authentication對象的name才能正確返回,否則拋出異常。

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

3.4 使用PreFilter注解

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

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

3.5 使用PostFilter 注解

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

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

總結(jié)

以上所述是小編給大家介紹的使用Spring安全表達式控制系統(tǒng)功能訪問權限問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

分享文章:使用Spring安全表達式控制系統(tǒng)功能訪問權限問題
文章鏈接:http://jinyejixie.com/article34/gpgope.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、建站公司、網(wǎng)站內(nèi)鏈、網(wǎng)頁設計公司品牌網(wǎng)站制作、網(wǎng)站設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務器托管
白银市| 江阴市| 东乌珠穆沁旗| 柳林县| 恩施市| 花垣县| 华宁县| 邻水| 凉山| 屯留县| 云龙县| 吉林市| 平度市| 洛宁县| 砚山县| 尼木县| 都兰县| 甘德县| 华容县| 九台市| 雅江县| 修武县| 平安县| 江口县| 兖州市| 塔城市| 梁山县| 比如县| 山阳县| 白朗县| 桓台县| 宜都市| 柳州市| 永川市| 双辽市| 伊通| 西畴县| 宜兰市| 安阳县| 宁晋县| 禹州市|