14.1 使用注解保护方法
Spring Security自带的@Secured注解;
JSR-250的@RolesAllowed注解;
表达式驱动的注解,包括@PreAuthorize、@PostAuthorize、@PreFilter和
@PostFilter。
14.1.1 使用@Secured注解限制方法调用
要在配置类上使用@EnableGlobalMethodSecurity:
@Configuration
@EnableGlobalMethodSecurity(securedEnabled=true)
public class MethodSecurityConfig() extends GlobalMethodSecurityConfiguration{
}
在需要添加保护的方法上使用@Secured注解:
@Secured注解会使用一个String数组作为参数,每个String值是一个权限,调用这 个方法至少需要具备其中的一个权限。
只允许具有ROLE_SPITTER权限的认证用户才能调用addSpittle ()方法
@Secured注解的不足之处在于它是Spring特定的注解
@Secured({"ROLE_SPITTER","ROLE_ADMIN"})
public void addSpittle(Spittle spittle){
}
14.1.2 使用@RolesAllowed注解
@RolesAllowed是JSR-250定义的Java标准注解
与securedEnabled并不冲突。这两种注解风格可以同时启用
@Configuration
@EnableGlobalMethodSecurity(jsr250Enabled=true)
public class MethodSecurityConfig() extends GlobalMethodSecurityConfiguration{
}
在需要添加保护的方法上使用@RolesAllowed注解:
跟@Secured一样,该种注解方式无法使用表达式来灵活执行控制
@RolesAllowed({"ROLE_SPITTER","ROLE_ADMIN"})
public void addSpittle(Spittle spittle){
}
14.2 使用表达式实现方法级别的安全性
在配置类上启用注解
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class MethodSecurityConfig() extends GlobalMethodSecurityConfiguration{
}
14.2.1 表述方法访问规则
@PreAuthorize:在方法调用前验证权限,String类型参数是一个SpEL表达式
#spittle部分直接引用了方法中的同名参数
@PreAuthorize("(hasRole('ROLE_SPITTER') and #spittle.text.length() < 140) or hasRole('ROLE_PREMIUM')")
public void addSpittle(Spittle spittle){
}
@PostAuthorize:在方法调用之后验证权限
SpEL中提供了名为returnObject的变量
principal是一个Spring Security内置的特殊名称,它代表了当前认证用户的主要信息
@PostAuthorize("returnObject.spitter.username == principal.username")
public Spittle getSpittleById(long id){
}
14.2.2 过滤方法的输入和输出
@PostFilter:事后对方法的返回值进行过滤
@PreAuthorize("hasAnyRole({'ROLE_SPITTER','ROLE_ADMIN'})")
@PostFilter("hasRole('ROLE_ADMIN') || filterObject.spitter.username == principal.username")
public List<Spittle> getOffensiveSpittles(){
}
@PreFilter:事先对方法的参数进行过滤
@PreAuthorize("hasAnyRole({'ROLE_SPITTER','ROLE_ADMIN'})")
@PostFilter("hasRole('ROLE_ADMIN') || targetObject.spitter.username == principal.username")
public void deleteSpittles(List<Spittle> spittles){
}
PermissionEvaluator:定义许可计算器,实现该接口,然后将实现类注册到Spring Security中 373
注册需要重载GlobalMethodSecurityConfiguration的createExpressionHandler方法