iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0
自我挑戰組

Java Spring專案的兩大元件 - Security、Schedule系列 第 21

Day21 : Spring Security - hasPermission的深入解析.1

  • 分享至 

  • xImage
  •  

Spring Security - hasPermission的深入解析.1

  • 為何要有hasPermission? ⭐⭐⭐⭐⭐
    • 或許在我自行實作的PermissionService可以應付一般的RBAC系統,然而針對某個特定資源要確認是否能存取的話,卻不是那麼容易寫。
      • 讓我們來看看如果要「刪除訂單id#0001」這件事要怎麼以PermissionService應付
        • 我需要建立 ps.canDeleteOrder(principal, #orderId)
      • 那如果要「編輯訂單id#0001」呢?
        • 我需要建立 ps.canEditOrder(principal, #orderId)
    • 透過上述例子可以發現PermissionService應對Permission的方式,是一直建立Method去應付各種狀況。十分不理想。
    • 因此針對「特定資源的動作驗證」,我們可以利用Spring設計的hasPermission 來做,其規定了參數的格式必須是 hasPermission(目標物件, 操作動作)hasPermission(目標ID, 實體型態, 操作動作),很能夠看出其對資源訪問的細粒程度。
  • SpEL的接收 ⭐⭐⭐⭐⭐⭐
    • 而在真正了解hasPermission之前,需要先來看看SpEL是怎麼被接收並解析的。

    MethodSecurityExpressionHandler

    • 在寫下 @PreAuthorize() 時,Spring會將內部的SpEL交由 MethodSecurityExpressionHandler 來解析文字!
    • MethodSecurityExpressionHandler 是介面,因此會藉由 DefaultMethodSecurityExpressionHandler 這個預設實作來解析文字。
    • 內部包含了 hasRolehasAuthority 等解析函式。而 hasPermission 則是委派給 「PermissionEvaluator」來解析。
    • 然而預設的PermissionEvaluator介面實作是 DenyAllPermissionEvaluator,與字面意思相同,就是遇到任何Permission都回傳false。
    • 因此我們需要自行建立 CustomPermissionEvaluator 來實作PermissionEvaluator,並自行設計屬於自己的Permission過濾器,最後再注入Hanlder當中完成註冊。
    • 而我們需要實作的PermissionEvaluator是基與Spring設計的統一格式,因此需要實作以下函式 :
    public interface PermissionEvaluator extends AopInfrastructureBean {
        boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission);
        boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission);
    }
    
    • 後續部分留到明天繼續研究吧!

本篇文章出自《每天學Java直到今年結束》Day236,大家可以到我的網站上查看~


上一篇
Day20 : Spring Security - 深入探討@PreAuthorize.2
系列文
Java Spring專案的兩大元件 - Security、Schedule21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言