欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2019年11月21日 13:59:04   作者:字母哥博客  
從spring security 3.0開(kāi)始已經(jīng)可以使用spring Expression表達(dá)式來(lái)控制授權(quán),允許在表達(dá)式中使用復(fù)雜的布爾邏輯來(lái)控制訪問(wèn)的權(quán)限。這篇文章主要介紹了使用Spring安全表達(dá)式控制系統(tǒng)功能訪問(wèn)權(quán)限,需要的朋友可以參考下

一、SPEL表達(dá)式權(quán)限控制

從spring security 3.0開(kāi)始已經(jīng)可以使用spring Expression表達(dá)式來(lái)控制授權(quán),允許在表達(dá)式中使用復(fù)雜的布爾邏輯來(lái)控制訪問(wèn)的權(quán)限。Spring Security可用表達(dá)式對(duì)象的基類(lèi)是SecurityExpressionRoot。

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

部分朋友可能會(huì)對(duì)Authority和Role有些混淆。Authority作為資源訪問(wèn)權(quán)限可大可小,可以是某按鈕的訪問(wèn)權(quán)限(如資源ID:biz1),也可以是某類(lèi)用戶(hù)角色的訪問(wèn)權(quán)限(如資源ID:ADMIN)。當(dāng)Authority作為角色資源權(quán)限時(shí),hasAuthority('ROLE_ADMIN')與hasRole('ADMIN')是一樣的效果。

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

我們可以通過(guò)繼承WebSecurityConfigurerAdapter,實(shí)現(xiàn)相關(guān)的配置方法,進(jìn)行全局的安全配置(之前的章節(jié)已經(jīng)講過(guò)) 。下面就為大家介紹一些如何在全局配置中使用SPEL表達(dá)式。

2.1.URL安全表達(dá)式

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

這里我們定義了應(yīng)用/person/*URL的范圍,只有擁有ADMIN或者USER權(quán)限的用戶(hù)才能訪問(wèn)這些person資源。

2.2.安全表達(dá)式中引用bean

這種方式,比較適合有復(fù)雜權(quán)限驗(yàn)證邏輯的情況,當(dāng)Spring Security提供的默認(rèn)表達(dá)式方法無(wú)法滿(mǎn)足我們的需求的時(shí)候。首先我們定義一個(gè)權(quán)限驗(yàn)證的RbacService。

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

對(duì)于"/person/{id}"對(duì)應(yīng)的資源的訪問(wèn),調(diào)用rbacService的bean的方法checkUserId進(jìn)行權(quán)限驗(yàn)證,傳遞參數(shù)為authentication對(duì)象和person的id。該id為PathVariable,以#開(kāi)頭表示。

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

三、 Method表達(dá)式安全控制

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

3.1.開(kāi)啟方法級(jí)別注解的配置

在Spring安全配置代碼中,加上EnableGlobalMethodSecurity注解,開(kāi)啟方法級(jí)別安全配置功能。

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

3.2 使用PreAuthorize注解

@PreAuthorize 注解適合進(jìn)入方法前的權(quán)限驗(yàn)證。只有擁有ADMIN角色才能訪問(wèn)findAll方法。

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

3.3 使用PostAuthorize注解

@PostAuthorize 在方法執(zhí)行后再進(jìn)行權(quán)限驗(yàn)證,適合根據(jù)返回值結(jié)果進(jìn)行權(quán)限驗(yàn)證。Spring EL 提供返回對(duì)象能夠在表達(dá)式語(yǔ)言中獲取返回的對(duì)象returnObject。下文代碼只有返回值的name等于authentication對(duì)象的name才能正確返回,否則拋出異常。

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

3.4 使用PreFilter注解

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

//當(dāng)有多個(gè)對(duì)象是使用filterTarget進(jìn)行標(biāo)注
@PreFilter(filterTarget="ids", value="filterObject%2==0")
public void delete(List<Integer> ids, List<String> usernames) {

3.5 使用PostFilter 注解

PostFilter 針對(duì)返回結(jié)果進(jìn)行過(guò)濾,特別適用于集合類(lèi)返回值,過(guò)濾集合中不符合表達(dá)式的對(duì)象。

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

總結(jié)

以上所述是小編給大家介紹的使用Spring安全表達(dá)式控制系統(tǒng)功能訪問(wèn)權(quán)限問(wèn)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • Spring boot如何基于攔截器實(shí)現(xiàn)訪問(wèn)權(quán)限限制

    Spring boot如何基于攔截器實(shí)現(xiàn)訪問(wèn)權(quán)限限制

    這篇文章主要介紹了Spring boot如何基于攔截器實(shí)現(xiàn)訪問(wèn)權(quán)限限制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • IDEA集成JProfiler11可視化工具的詳細(xì)流程(安裝、集成、測(cè)試)

    IDEA集成JProfiler11可視化工具的詳細(xì)流程(安裝、集成、測(cè)試)

    小編打算在IDEA中集成一下JProfiler11(現(xiàn)在有12版本了)工具,到網(wǎng)上搜都沒(méi)有找到合適的,于是自己動(dòng)手寫(xiě)個(gè),關(guān)于IDEA集成JProfiler11可視化工具(安裝、集成、測(cè)試)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-06-06
  • Java實(shí)現(xiàn)文件上傳保存

    Java實(shí)現(xiàn)文件上傳保存

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)文件上傳保存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java方法重載和重寫(xiě)原理區(qū)別解析

    Java方法重載和重寫(xiě)原理區(qū)別解析

    這篇文章主要介紹了Java方法重載和重寫(xiě)原理區(qū)別解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring與MyBatis集成?AOP整合PageHelper插件的操作過(guò)程

    Spring與MyBatis集成?AOP整合PageHelper插件的操作過(guò)程

    Spring與MyBatis集成的主要目的是為了提供更強(qiáng)大的數(shù)據(jù)訪問(wèn)和事務(wù)管理能力,以及簡(jiǎn)化配置和提高開(kāi)發(fā)效率,這篇文章主要介紹了Spring與MyBatis集成AOP整合PageHelper插件,需要的朋友可以參考下
    2023-08-08
  • Java?JSON處理庫(kù)之Gson的用法詳解

    Java?JSON處理庫(kù)之Gson的用法詳解

    Gson是Google開(kāi)發(fā)的一款Java?JSON處理庫(kù),旨在簡(jiǎn)化Java開(kāi)發(fā)人員操作JSON數(shù)據(jù)的過(guò)程,本文就來(lái)和大家簡(jiǎn)單聊聊Gson的原理與具體使用吧
    2023-05-05
  • java使用randomaccessfile在文件任意位置寫(xiě)入數(shù)據(jù)

    java使用randomaccessfile在文件任意位置寫(xiě)入數(shù)據(jù)

    Java在文件任意位置寫(xiě)入數(shù)據(jù)可以使用RandomAccessFile方法來(lái)完成,下面看一個(gè)簡(jiǎn)單的示例就明白了
    2014-01-01
  • Spring cloud踩坑記錄之使用feignclient遠(yuǎn)程調(diào)用服務(wù)404的方法

    Spring cloud踩坑記錄之使用feignclient遠(yuǎn)程調(diào)用服務(wù)404的方法

    這篇文章主要給大家介紹了關(guān)于Spring cloud踩坑記錄之使用feignclient遠(yuǎn)程調(diào)用服務(wù)404的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • java中用ObjectMapper類(lèi)實(shí)現(xiàn)Json與bean的轉(zhuǎn)換示例

    java中用ObjectMapper類(lèi)實(shí)現(xiàn)Json與bean的轉(zhuǎn)換示例

    這篇文章主要給大家介紹了關(guān)于在java中用ObjectMapper類(lèi)實(shí)現(xiàn)Json與bean轉(zhuǎn)換的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • java多線(xiàn)程編程之從線(xiàn)程返回?cái)?shù)據(jù)的兩種方法

    java多線(xiàn)程編程之從線(xiàn)程返回?cái)?shù)據(jù)的兩種方法

    從線(xiàn)程中返回?cái)?shù)據(jù)和向線(xiàn)程傳遞數(shù)據(jù)類(lèi)似。也可以通過(guò)類(lèi)成員以及回調(diào)函數(shù)來(lái)返回?cái)?shù)據(jù)。但類(lèi)成員在返回?cái)?shù)據(jù)和傳遞數(shù)據(jù)時(shí)有一些區(qū)別,下面讓我們來(lái)看看它們區(qū)別在哪
    2014-01-01

最新評(píng)論