Spring Security——基於表達式的權限控制


一、 Spring EL表達式:

  Spring Security允許我們在定義URL訪問或方法訪問所應有的權限時使用Spring EL表達式,在定義所需的訪問權限時如果對應的表達式返回結果為true則表示擁有對應的權限,反之則無。Spring Security可用表達式對象的基類是SecurityExpressionRoot,其為我們提供了如下在使用Spring EL表達式對URL或方法進行權限控制時通用的內置表達式。

表達式

描述

hasRole([role])

當前用戶是否擁有指定角色。

hasAnyRole([role1,role2])

多個角色是一個以逗號進行分隔的字符串。如果當前用戶擁有指定角色中的任意一個則返回true。

hasAuthority([auth])

等同於hasRole

hasAnyAuthority([auth1,auth2])

等同於hasAnyRole

Principle

代表當前用戶的principle對象

authentication

直接從SecurityContext獲取的當前Authentication對象

permitAll

總是返回true,表示允許所有的

denyAll

總是返回false,表示拒絕所有的

isAnonymous()

當前用戶是否是一個匿名用戶

isRememberMe()

表示當前用戶是否是通過Remember-Me自動登錄的

isAuthenticated()

表示當前用戶是否已經登錄認證成功了。

isFullyAuthenticated()

如果當前用戶既不是一個匿名用戶,同時又不是通過Remember-Me自動登錄的,則返回true。

二、通過表達式控制方法權限:

2.1、JSR-250注解

   要使用JSR-250注解,首先我們需要通過設置global-method-security元素的jsr250-annotation=”enabled”來啟用基於JSR-250注解的支持,默認為disabled。

  @EnableGlobalMethodSecurity( jsr250Enabled = true)

   RolesAllowed表示訪問對應方法時所應該具有的角色。其可以標注在類上,也可以標注在方法上,當標注在類上時表示其中所有方法的執行都需要對應的角色,當標注在方法上表示執行該方法時所需要的角色,當方法和類上都使用了@RolesAllowed進行標注,則方法上的@RolesAllowed將覆蓋類上的@RolesAllowed,即方法上的@RolesAllowed將對當前方法起作用。@RolesAllowed的值是由角色名稱組成的數組。

       PermitAll表示允許所有的角色進行訪問,也就是說不進行權限控制。@PermitAll可以標注在方法上也可以標注在類上,當標注在方法上時則只對對應方法不進行權限控制,而標注在類上時表示對類里面所有的方法都不進行權限控制。(1)當@PermitAll標注在類上,而@RolesAllowed標注在方法上時則按照@RolesAllowed將覆蓋@PermitAll,即需要@RolesAllowed對應的角色才能訪問。(2)當@RolesAllowed標注在類上,而@PermitAll標注在方法上時則對應的方法也是不進行權限控制的。(3)當在方法上同時使用了@PermitAll和@RolesAllowed時先定義的將發生作用,而都定義在類上時則是反過來的,即后定義的將發生作用(這個沒多大的實際意義,實際應用中不會有這樣的定義)。

       DenyAll是和PermitAll相反的,表示無論什么角色都不能訪問。@DenyAll只能定義在方法上。你可能會有疑問使用@DenyAll標注的方法無論擁有什么權限都不能訪問,那還定義它干啥呢?使用@DenyAll定義的方法只是在我們的權限控制中不能訪問,脫離了權限控制還是可以訪問的。

2.2、@Secured注解

  @Secured是由Spring Security定義的用來支持方法權限控制的注解。它的使用也是需要啟用對應的支持才會生效的。通過設置global-method-security元素的secured-annotations=”enabled”可以啟用Spring Security對使用@Secured注解標注的方法進行權限控制的支持,其值默認為disabled。

  @EnableGlobalMethodSecurity( securedEnabled= true)  

2.3、 支持表達式的注解

  Spring Security中定義了四個支持使用表達式的注解,分別是@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。其中前兩者可以用來在方法調用前或者調用后進行權限檢查,后兩者可以用來對集合類型的參數或者返回值進行過濾。

  @EnableGlobalMethodSecurity(prePostEnabled = true)

 

基於方法的權限控制  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM