第14章 保护方法应用

来源:互联网 发布:php开发简历自己缺点 编辑:程序博客网 时间:2024/06/04 19:46

概述:为方法设置调用权限过滤

Spring Security提供了三种不同的安全注解:、

  • Spring Security 自带的@Secured注解
  • JSR-250的@RolesAllowed 注解
  • 表达式驱动的注解 包括@PreAuthorize @PostAuthorize 、@PreFilter 和 @PostFilter

1、@Secured注解限制方法调用

@Configuration

@EnableGlobalMethodSecurity(securedEnabled=true)

public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {


}

@Secured({"ROLE_SPITTER", "ROLE_ADMIN"})

public void addSpittle(Spittle spittle) {


}


2、Spring Security 中使用JSR-250 的@RolesAllowed注解

@Configuration

@EnableGlobalMethodSecurity(jsr250Enabled=true)

public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {


}

@RolesAllowed({"ROLE_SPITTER", "ROLE_ADMIN"})

public void addSpittle(Spittle spittle) {


}



3、使用表达式实现方法级别的安全性

@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){

}