方法授权
- 现在我们已经掌握了如何使用http.authortizeRequests()对web资源进行授权保护,从Spring Security2.0版本开始,它支持服务层方法的安全性的支持。本节学习@PreAuthorize,@PostAuthorize,@Secured三类注解。
- 我们可以在任何
@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);
}
- 以上配置标明readAccount,findAccounts方法可匿名访问,底层使用WebExpressionVoter投票器,可从AffirmativeBased第23行代码跟踪。
- post方法需要有TELLER角色才能访问,底层使用RoleVoter投票器。
- 使用如下代码可启用prePost注解的支持
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig {
//...
}
public interface BankService {
@PreAuthorize("isAnonymous()")
public Account readAccount(Long id);
@PreAuthorize("isAnonymous()")
public Account[] findAccounts();
@PreAuthorize("hasAuthority('p_transfer') and hasAuthority('p_read_account')")
public Account post (Account account, double amount);
}
- 以上配置标明readAccount,findAccounts方法可匿名访问,post需要方法需要同时拥有p_transfer和p_read_account权限才能访问,底层使用WebExpressionVoter投票器,可从AffirmativeBased第23行代码其跟踪。