第三章 基于方法级别的安全配置
Spring Security 提供了两种方法级别的安全配置,一个是框架的原始注释 @secure ,另一个新的基于表达式的注释。
可以针对单个 Bean 进行保护,也可以使用 AspectJ 风格的切入点跨服务层保护多个 Bean。
一、EnableGlobalMethodSecurity 注解
在任何 @Configuration
实例上使用 @EnableGlobalMethodSecurity
注释,启用基于注释的安全性。示例如下:
@EnableGlobalMethodSecurity(securedEnabled = true)
@Configuration
public class MethodSecurityConfig {
// ...
}
然后向方法添加注释,将相应地限制对该方法的访问。这些信息将会被传递给 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);
}
或者使用 基于表达式的语法:
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class MethodSecurityConfig {
// ...
}
public interface BankService {
@PreAuthorize("isAnnoymous()")
public Account readAccount(Long id);
@PreAuthorize("isAnnoymous()")
public Account[] findAccounts();
@PreAuthorize("hasAuthority('ROLE_TELLER')")
public Account post(Account account, double amount);
}
二、自定义方法安全配置
如果需要执行比 @EnableGlobalMethodSecurity 注释提供的更复杂的操作,可以扩展 GlobalMethodSecurityConfiguration。
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class methodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler(){
// create and return custom handler
return expressionHandler;
}
}