最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

我們可以通過繼承WebSecurityConfigurerAdapter,實現(xiàn)相關(guān)的配置方法,進(jìn)行全局的安全配置(之前的章節(jié)已經(jīng)講過) 。下面就為大家介紹一些如何在全局配置中使用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)限的用戶才能訪問這些person資源。

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

這種方式,比較適合有復(fù)雜權(quán)限驗證邏輯的情況,當(dāng)Spring Security提供的默認(rèn)表達(dá)式方法無法滿足我們的需求的時候。首先我們定義一個權(quán)限驗證的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}"對應(yīng)的資源的訪問,調(diào)用rbacService的bean的方法checkUserId進(jìn)行權(quán)限驗證,傳遞參數(shù)為authentication對象和person的id。該id為PathVariable,以#開頭表示。

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

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

如果我們想實現(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 注解適合進(jìn)入方法前的權(quán)限驗證。只有擁有ADMIN角色才能訪問findAll方法。

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

3.3 使用PostAuthorize注解

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

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

3.4 使用PreFilter注解

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

//當(dāng)有多個對象是使用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 針對返回結(jié)果進(jìn)行過濾,特別適用于集合類返回值,過濾集合中不符合表達(dá)式的對象。

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

總結(jié)

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

相關(guān)文章

  • Java調(diào)用groovy腳本的方式分享

    Java調(diào)用groovy腳本的方式分享

    Groovy?是一種基于?JVM?的動態(tài)語言,與?Java?語言緊密集成,可以很方便地在?Java?項目中使用。本文為大家整理了Java調(diào)用groovy腳本的幾種方式,希望對大家有所幫助
    2023-04-04
  • springbean的八種加載方式匯總

    springbean的八種加載方式匯總

    這篇文章主要介紹了springbean的八種加載方式,一種是XML方式聲明bean,使用@Component及其衍生注解@Controller?、@Service、@Repository定義bean,還有其他方法,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • SpringMVC使用RESTful接口案例

    SpringMVC使用RESTful接口案例

    RESTful是一種web軟件風(fēng)格,它不是標(biāo)準(zhǔn)也不是協(xié)議,它不一定要采用,只是一種風(fēng)格,它倡導(dǎo)的是一個資源定位(url)及資源操作的風(fēng)格,這篇文章主要介紹了SpringBoot使用RESTful接口
    2022-12-12
  • 通過java.util.TreeMap源碼加強(qiáng)紅黑樹的理解

    通過java.util.TreeMap源碼加強(qiáng)紅黑樹的理解

    通過分析java.util.TreeMap源碼來對經(jīng)典問題紅黑樹加強(qiáng)理解和理清思路。
    2017-11-11
  • 關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項

    關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項

    這篇文章主要介紹了關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項,匿名內(nèi)部類顧名思義是沒有修飾符甚至沒有名稱的內(nèi)部類,使用匿名內(nèi)部類需要注意哪些地方,我們一起來看看吧
    2023-03-03
  • Springcloud中的region和zone的使用實例

    Springcloud中的region和zone的使用實例

    這篇文章主要介紹了Springcloud中的region和zone的使用實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • SpringMvc中的Bean加載機(jī)制詳解

    SpringMvc中的Bean加載機(jī)制詳解

    這篇文章主要介紹了SpringMvc中的Bean加載機(jī)制詳解,在Spring MVC中,Bean的作用主要是處理應(yīng)用程序的業(yè)務(wù)邏輯和數(shù)據(jù),例如,一個用戶管理應(yīng)用程序的Bean可能包括UserService、UserDao和UserController等,需要的朋友可以參考下
    2023-12-12
  • Java輸入流Scanner/BufferedReader使用方法示例

    Java輸入流Scanner/BufferedReader使用方法示例

    這篇文章主要介紹了Java輸入流Scanner/BufferedReader使用方法,大家看示例吧
    2013-11-11
  • JDBC實現(xiàn)Mysql自動重連機(jī)制的方法詳解

    JDBC實現(xiàn)Mysql自動重連機(jī)制的方法詳解

    最近在工作中發(fā)現(xiàn)了一個問題,通過查找相關(guān)的資料終于解決了,下面這篇文章主要給大家介紹了關(guān)于JDBC實現(xiàn)Mysql自動重連機(jī)制的相關(guān)資料,文中給出多種解決的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • SpringCloud Ribbon負(fù)載均衡工具使用

    SpringCloud Ribbon負(fù)載均衡工具使用

    Ribbon是Netflix的組件之一,負(fù)責(zé)注冊中心的負(fù)載均衡,有助于控制HTTP和TCP客戶端行為。Spring?Cloud?Netflix?Ribbon一般配合Ribbon進(jìn)行使用,利用在Eureka中讀取的服務(wù)信息,在調(diào)用服務(wù)節(jié)點時合理進(jìn)行負(fù)載
    2023-02-02

最新評論

望城县| 青河县| 甘肃省| 都匀市| 万全县| 东丰县| 平凉市| 仁怀市| 岑巩县| 肥西县| 长丰县| 乌鲁木齐市| 桂阳县| 临安市| 桓台县| 平泉县| 景东| 陈巴尔虎旗| 肥东县| 蒲城县| 阿克陶县| 莎车县| 晋江市| 云阳县| 百色市| 格尔木市| 湖州市| 富蕴县| 泰宁县| 清远市| 永顺县| 怀化市| 鄱阳县| 英德市| 万年县| 罗山县| 龙陵县| 和平县| 垫江县| 嫩江县| 新源县|