5.10. 方法層級安全
從 2.0 開始,Spring Security 大幅度增加了對服務層方法安全的支援,提供對 JSR-250 安全註解的支援,以及框架原生的 @Secure
註解。
從 3.0 開始,你還可以使用新的 表達式註解。
你可以對一個 bean 作安全控制、可以在宣告 bean 時使用 intercept-methods
元素,或者也可以使用 AspectJ 形式的 pointcut 來保護整個服務層的多個 bean。
5.10.1. @EnableGlobalMethodSecurity
我們可以透過在任何有 @Configuration
註解的實例加上 @EnableGlobalMethodSecurity
以開啟註解式安全控制功能。
例如以下範例可以開啟 Spring Security 的 @Secured
註解功能:
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig {
// ...
}
接著在類別或介面中的方法加上註解,就可以根據註解來限制調用方法的權限。
Spring Security 原生的註解支援對方法設定一組屬性,這些屬性會被傳遞給 AccessDecisionManager
以實際作出決定。
public interface BankService {
@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account readAccount(Long id);
@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account[] findAccounts();
@Secured("ROLE_TELLER")
public Account post(Account account, double amount);
}
若要開啟對 JSR-250 註解的支援:
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig {
// ...
}
然後相等的 Java 程式碼:
public interface BankService {
@PreAuthorize("isAnonymous()")
public Account readAccount(Long id);
@PreAuthorize("isAnonymous()")
public Account[] findAccounts();
@PreAuthorize("hasAuthority('ROLE_TELLER')")
public Account post(Account account, double amount);
}
5.10.2. GlobalMethodSecurityConfiguration
有時候你可能會要執行一些比 @EnableGlobalMethodSecurit
允許的更複雜的行動,這種情況下,你可以繼承 GlobalMethodSecurityConfiguration
以確保 @EnableGlobalMethodSecurity
註解會出現在繼承後的類別上。
舉例來說,如果你想要提供一個自訂的 MethodSecurityExpressionHandler
,你可以使用以下設定:
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
// ... 建立並返回自訂的 MethodSecurityExpressionHandler ...
return expressionHandler;
}
}
想知道可以被 override 的方法的更多資訊,請參考 GlobalMethodSecurityConfiguration
的 Javadoc。
5.10.3. EnableReactiveMethodSecurity
沒在用 Webflux,先跳過。