25.2. 觸發前處理
我們在 9.5.2. Secure Object 及 AbstractSecurityInterceptor
也看到,Spring Security 提供許多攔截器來控制 secure object 的存取,例如方法觸發或網路請求。
一個是否允許觸發的觸發前決策是由 AccessDecisionManager
來做。
25.2.1. AccessDecisionManager
AccessDecisionManager
是由 AbstractSecurityInterceptor
來呼叫,並且負責做最終存取控制決策。
AccessDecisionManager
介面包含三個方法:
void decide(Authentication authentication, Object secureObject, Collection<ConfigAttribute> attrs) throws AccessDeniedException;
boolean supports(ConfigAttribute attribute);
boolean supports(Class clazz);
AccessDecisionManager
所需用來做出授權決策的相關資訊都會被傳入 decide()
方法,特別是將 secure Object
傳入,以對真正傳入 secure object 觸發過程的參數進行檢驗。
舉例來說,假設 secure object 是一個 MethodInvocation
,它就可以很簡單的查詢 MethodInvocation
是否有任何的 Customer
參數,並在 AccessDecisionManger
實作某種安全邏輯來確保使用端被允許對該 customer 進行操作,並且實作應該要在存取被拒的時候拋出 AccessDeniedException
。
supports(ConfigAttribute)
方法會在 AbstractSecurityInterceptor
初始時被觸發,以決定該 AccessDecisionManager
是否可以處理傳入的 ConfigAttribute
;而 supports(Class)
方法則會被某個安全攔截器的實作觸發,以確保該 AccessDecisionManager
支援該攔截器會攔截的 secure object 類型