后端基於方法的權限控制--Spirng-Security


后端基於方法的權限控制--Spirng-Security
默認情況下, Spring Security 並不啟用方法級的安全管控. 啟用方法級的管控后, 可以針對不同的方法通過注解設置不同的訪問條件;Spring Security 支持三種方法級注解, 分別是 JSR-205/Secured 注解/prePostEnabled。

開啟方法級別注解

<global-method-security secured-annotations="enabled" />

<global-method-security jsr250-annotations="enabled" />

<global-method-security pre-post-annotations="enabled" />

//@Secured 注解
@EnableGlobalMethodSecurity(securedEnabled=true)
//JSR-205 注解
@EnableGlobalMethodSecurity(jsr250Enabled=true)
//@PreAuthorize 類型的注解(支持 Spring 表達式)
@EnableGlobalMethodSecurity(prePostEnabled=true)
開始方法級別的注釋使用
  1. Secured
    只有滿足角色的用戶才能訪問被注解的方法, 否則將會拋出 AccessDenied 異常.

    @Secured("ROLE_TELLER","ROLE_ADMIN"), 該方法只允許 ROLE_TELLER 或 ROLE_ADMIN 角色的用戶訪問.
    @Secured("IS_AUTHENTICATED_ANONYMOUSLY"), 該方法允許匿名用戶訪問.

  2. JSR-205

    @DenyAll 注解, 拒絕所有的訪問
    @PermitAll 注解, 運行所有訪問
    @RolesAllowed({"USER","ADMIN"}), 該方法只允許有 ROLE_USER 或 ROLE_ADMIN 角色的用戶訪問.

  3. PreAuthorize
    JSR-205 和 Secured 注解功能較弱, 不支持 Spring EL 表達式. 推薦使用 @PreAuthorize 類型的注解.

    @PreAuthorize 注解, 在方法調用之前, 基於表達式結果來限制方法的使用.
    @PostAuthorize 注解, 允許方法調用, 但是如果表達式結果為 false, 將拋出一個安全性異常.
    @PostFilter 注解, 允許方法調用, 但必要按照表達式來過濾方法的結果.
    @PreFilter 注解, 允許方法調用, 但必須在進入方法之前過來輸入值.

詳解PreAuthorize表達式
  1. returnObject 保留名
    對於 @PostAuthorize 和 @PostFilter 注解, 可以在表達式中使用 returnObject 保留名, returnObject 代表着被注解方法的返回值, 我們可以使用 returnObject 保留名對注解方法的結果進行驗證.
    比如:
@PostAuthorize ("returnObject.owner == authentication.name")
public Book getBook();

@PostAuthorize 和 @PostFilter 本身在方法之后使用 ;本身使用場景不多

  1. 表達式中的 # 號
    在表達式中, 可以使用 #argument123 的形式來代表注解方法中的參數 argument123.
    比如:
@PreAuthorize ("#book.owner == authentication.name")
public void deleteBook(Book book);

還有一種 #argument123 的寫法, 即使用 Spring Security @P注解來為方法參數起別名, 然后在 @PreAuthorize 等注解表達式中使用該別名. 不推薦這種寫法, 代碼可讀性較差.

@PreAuthorize("#c.name == authentication.name")
public void doSomething(@P("c") Contact contact);
  1. 內置表達式有:
表達式 備注
hasRole([role]) 如果有當前角色, 則返回 true(會自動加上 ROLE_ 前綴)
hasAnyRole([role1, role2]) 如果有任一角色即可通過校驗, 返回true,(會自動加上 ROLE_ 前綴)
hasAuthority([authority]) 如果有指定權限, 則返回 true
hasAnyAuthority([authority1, authority2]) 如果有任一指定權限, 則返回true
principal 獲取當前用戶的 principal 主體對象
authentication 獲取當前用戶的 authentication 對象,
permitAll 總是返回 true, 表示全部允許
denyAll 總是返回 false, 代表全部拒絕
isAnonymous() 如果是匿名訪問, 返回true
isRememberMe() 如果是remember-me 自動認證, 則返回 true
isAuthenticated() 如果不是匿名訪問, 則返回true
isFullAuthenticated() 如果不是匿名訪問或remember-me認證登陸, 則返回true
hasPermission(Object target, Object permission)
hasPermission(Object target, String targetType, Object permission)


免責聲明!

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



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