概述:为方法设置调用权限过滤
Spring Security提供了三种不同的安全注解:、
Spring Security 自带的@Secured注解JSR-250的@RolesAllowed 注解表达式驱动的注解 包括@PreAuthorize @PostAuthorize 、@PreFilter 和 @PostFilter@Configuration
@EnableGlobalMethodSecurity(securedEnabled=true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}
@Secured({"ROLE_SPITTER", "ROLE_ADMIN"})
public void addSpittle(Spittle spittle) {
}
@Configuration
@EnableGlobalMethodSecurity(jsr250Enabled=true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}
@RolesAllowed({"ROLE_SPITTER", "ROLE_ADMIN"})
public void addSpittle(Spittle spittle) {
}
@PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问
@PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常
@PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
@PreFilter 允许方法调用,但必须在进入方法之前过滤输入值
@PreAuthorize(
"(hasRole('ROLE_SPITTER') and #spittle.text.length() <= 140)"
+ " or hasRole('ROLE_PREMIUM')")
public void addSpittle (Spittle spittle){
}
表示:普通用户输入的字数小于140,会员不限,更加灵活
方法之后调用
@PostAuthorize("returnObject.spitter.username==principal.username")
public Spittle getSpittleById(long id){}
如果是非常复杂的可以定义许可计算器(简单理解的就是定义一个类,取处理)
需要实现接口 PermissionEvaluator ,重写 两个hasPermission()方法
@PreAuthorize(
"(hasRole('ROLE_SPITTER') and #spittle.text.length() <= 140)"
+ " or hasRole('ROLE_PREMIUM')")
@PreFilter ("hasPermission(targetObject, 'delete')")
public void addSpittle (Spittle spittle){
}