SpringSecurity-權限關聯與控制



#6.3 服務器端方法級權限控制 在服務器端我們可以通過Spring security提供的注解對方法來進行權限控制。Spring Security在方法的權限控制上 支持三種類型的注解,JSR-250注解、@Secured注解和支持表達式的注解,這三種注解默認都是沒有啟用的,需要 單獨通過global-method-security元素的對應屬性進行啟用
##6.3.1.開啟注解使用 配置文件 ``` ``` 注解開啟 @EnableGlobalMethodSecurity :Spring Security默認是禁用注解的,要想開啟注解,需要在繼承 WebSecurityConfigurerAdapter的類上加@EnableGlobalMethodSecurity注解,並在該類中將 AuthenticationManager定義為Bean。
##6.3.2.JSR-250注解 ![](https://img2018.cnblogs.com/blog/1234139/201908/1234139-20190810160124520-411949901.bmp)

@RolesAllowed表示訪問對應方法時所應該具有的角色
示例:

@RolesAllowed({"USER", "ADMIN"}) 該方法只要具有"USER", "ADMIN"任意一種權限就可以訪問。這里可以省
略前綴ROLE_,實際的權限可能是ROLE_ADMIN

@PermitAll表示允許所有的角色進行訪問,也就是說不進行權限控制
@DenyAll是和PermitAll相反的,表示無論什么角色都不能訪問

6.3.3.支持表達式的注解

@PreAuthorize 在方法調用之前,基於表達式的計算結果來限制對方法的訪問

示例:
@PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")
void changePassword(@P("userId") long userId ){ }
這里表示在changePassword方法執行之前,判斷方法參數userId的值是否等於principal中保存的當前用戶的
userId,或者當前用戶是否具有ROLE_ADMIN權限,兩種符合其一,就可以訪問該方法。

@PostAuthorize 允許方法調用,但是如果表達式計算結果為false,將拋出一個安全性異常

示例:
@PostAuthorize
User getUser("returnObject.userId == authentication.principal.userId or
hasPermission(returnObject, 'ADMIN')");

@PostFilter 允許方法調用,但必須按照表達式來過濾方法的結果
@PreFilter 允許方法調用,但必須在進入方法之前過濾輸入值

6.3.4.@Secured注解

@Secured注解標注的方法進行權限控制的支持,其值默認為disabled。
示例:
@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account readAccount(Long id);
@Secured("ROLE_TELLER")


6.4 頁面端標簽控制權限

在jsp頁面中我們可以使用spring security提供的權限標簽來進行權限控制


##6.4.1.導入 maven導入 ``` org.springframework.security spring-security-taglibs version ``` 頁面導入 ``` <%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%> ```
##6.4.2.常用標簽 在jsp中我們可以使用以下三種標簽,其中authentication代表的是當前認證對象,可以獲取當前認證對象信息,例 如用戶名。其它兩個標簽我們可以用於權限控制 ###6.4.2.1 authentication ``` ``` property: 只允許指定Authentication所擁有的屬性,可以進行屬性的級聯獲取,如“principal.username”, 不允許直接通過方法進行調用 htmlEscape:表示是否需要將html進行轉義。默認為true。 scope:與var屬性一起使用,用於指定存放獲取的結果的屬性名的作用范圍,默認我pageContext。Jsp中擁 有的作用范圍都進行進行指定 var: 用於指定一個屬性名,這樣當獲取到了authentication的相關信息后會將其以var指定的屬性名進行存 放,默認是存放在pageConext中 ###6.4.2.2 authorize authorize是用來判斷普通權限的,通過判斷用戶是否具有對應的權限而控制其所包含內容的顯示 ``` ``` access: 需要使用表達式來判斷權限,當表達式的返回結果為true時表示擁有對應的權限 method:method屬性是配合url屬性一起使用的,表示用戶應當具有指定url指定method訪問的權限, method的默認值為GET,可選值為http請求的7種方法 url:url表示如果用戶擁有訪問指定url的權限即表示可以顯示authorize標簽包含的內容 var:用於指定將權限鑒定的結果存放在pageContext的哪個屬性中

注意:使用authorize ,spring-security.xml 配置文件中,配置具體的規則,必須使用SPEL表達式的寫法,如下圖所示

6.4.2.3 accesscontrollist

accesscontrollist標簽是用於鑒定ACL權限的。其一共定義了三個屬性:hasPermission、domainObject和var,
其中前兩個是必須指定的

<security:accesscontrollist hasPermission="" domainObject="" var=""></security:accesscontrollist>

hasPermission:hasPermission屬性用於指定以逗號分隔的權限列表
domainObject:domainObject用於指定對應的域對象
var:var則是用以將鑒定的結果以指定的屬性名存入pageContext中,以供同一頁面的其它地方使用


免責聲明!

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



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