Spring Security应用开发(18)基于方法的授权(二)过滤

本文将介绍@PreFilter和@PostFilter这两个注解。

@PreFilter

@PreFilter用于对方法的参数进行过滤。这种情况下参数通常是集合类型,符合条件的值被保留在集合中,不符合条件的从集合中移除。如果有多个集合类型的参数,需要使用@PreFilter的一个属性filterTarget来指定要过来的参数的名称。

@PostFilter。

@PostFilter用于对方法的结果进行过滤。这种情况下返回值通常是集合类型,符合条件的值被保留在集合中,不符合条件的从集合中移除。

@PreFilter注解的定义如下所示:

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface PreFilter {
public String value();
public String filterTarget() default "";
}

从上述定义可以看到,这些注解除了可以使用在方法上之外,还可以使用到类型上。

本文给出一个实例:

(1)编写集合中的元素类型的定义。

/**
* @ClassName: UserBean
* @Description:
* @author http://www.cnblogs.com/coe2coe/
* @date 2017年5月30日 下午9:12:46
*
*/
public class UserBean {

public UserBean(String name, int salary) {
super();
this.name = name;
this.salary = salary;
}

private String name;
private int    salary;
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getSalary() {
return salary;
}

public void setSalary(int salary) {
this.salary = salary;
}

@Override
public String toString() {
return "UserBean [name=" + name + ", salary=" + salary + "]";
}
}

(2)定义待授权的类和方法。

定义该类和方法,并在该方法上定义@PreFilter和@PostFilter注解。目标是先过滤参数salaryList,只保留其中salary>1000的元素,再过滤返回值,只保留其中name属性的长度大于3的元素。

public class UserService {

@PreFilter( filterTarget="salaryList" , value="filterObject > 1000" )
@PostFilter( "filterObject.name.length()>3")
public List<UserBean>  getUsers(List<String> nameList,List<Integer> salaryList){

List<UserBean>  users = new ArrayList<UserBean>();
for(int i=0;i<nameList.size()&&i<salaryList.size();i++){
users.add(new UserBean(nameList.get(i),salaryList.get(i) ) );
}

return users;
}

}

(3)定义调用该方法的控制器方法。

@RequestMapping("/")
public ModelAndView  index(){
ModelAndView  mv = new ModelAndView();
mv.addObject("message", "Hello,welcome!");
mv.setViewName("home/index");

//准备了4个元素的集合。
List<String> nameList = new ArrayList<String>();
List<Integer> salaryList = new ArrayList<Integer>();

nameList.add("zhangsan");
nameList.add("lisi");
nameList.add("wangwu");
nameList.add("li");

salaryList.add(10);
salaryList.add(1001);
salaryList.add(2000);
salaryList.add(3000);

List<UserBean> users = this.userService.getUsers(nameList,salaryList);

//测试用途,仅仅输出到控制台。
System.out.println(users);

return mv;

}

(4)运行结果:

最后返回值的结果是3个元素的集合。

控制台输出如下:

[UserBean [name=zhangsan, salary=1001], UserBean [name=lisi, salary=2000], UserBean [name=wangwu, salary=3000]]

本文为了测试@PreFilter注解的filterTarget属性的用法,被测试的方法使用了两个参数。由于filterTarget属性只能指定一个参数,同时同一个方法上只能定义唯一一个@PreFilter注解,因此getUsers()方法实际看到的参数中,nameList有4个元素,salaryList有3个元素,造成了错位。实际应用时,可将nameList和salaryList合并为一个集合,这样就能充分发挥@PreFilter的效果。

关于注解的可重复使用问题,请参考博客Java重要技术(17)注解之注解的重复使用

时间: 2024-10-13 08:16:42

Spring Security应用开发(18)基于方法的授权(二)过滤的相关文章

Spring Security应用开发(19)基于方法的授权(三)AOP

本文介绍使用AOP的配置方式来实现基于方法的授权. (1)首先使用Spring Security提供的protect-pointcut进行配置. protect-pointcut结点配置访问符合指定条件的方法锁需要的角色列表. <!-- 使用AOP的方式来定义方法级别的访问控制 --> <sec:global-method-security> <sec:protect-pointcut access="ROLE_USER,ROLE_ADMIN" expre

Spring Security应用开发(21)基于方法的授权(五)使用@Secured注解

Spring Security提供了@Secured注解来实现基于方法的授权控制. @Secured注解可以指定一个字符串数组参数作为value的值,表示当前用户具备这些角色中的任何一个角色即可满足授权条件. (1)启用@Secured注解. <sec:global-method-security secured-annotations="enabled" /> (2)使用Secured注解. //getUserByName()方法可以被具备ROLE_ADMIN或者ROLE

Spring Security应用开发(17)基于方法的授权(一)评估

Spring Security提供了4个用于方法的注解: @PreAuthorize.@PostAuthorize.@PreFilter和@PostFilter.本文介绍前面2个注解. @PreAuthorize 使用Spring Security的表达式来在方法执行之前控制允许执行某个方法. 如果表达式评估结果为false,则该方法不会被执行.@PreAuthorize的表达式通常是对方法的参数进行检查. @PostAuthorize 使用Spring Security的表达式在方法执行之后控

Spring Security应用开发(20)基于方法的授权(四)使用@RolesAllowed注解

Spring Security还提供了一种基于注解的方式来实现基于方法的授权.这就是本文介绍的@RolesAllowed注解.@RolesAllowed是JSR250定义的注解. (1)在spring-security.xml文件中启用JSR250注解支持. <!-- 启用JSR250支持:@RolesAllowed注解 --> <sec:global-method-security jsr250-annotations="enabled" /> (2)在需要授

Spring Security应用开发(16)基于表达式的访问控制

1.1.1. 通用表达式 Spring Security 使用基于Spring EL的表达式来进行访问控制.内置的表达式如下表所示: 表达式 描述 hasRole(role) 当前主体(principal)是否支持role角色.支持则返回true hasAnyRole(role1,role2) 当前主体是否支持role1,role2中的任意一个角色. hasAuthority(authority) 跟hasRole(role)相似. hasAnyAuthority(authority1,auth

Spring Security(17)——基于方法的权限控制

目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-250注解 1.3.2    @Secured注解 1.3.3    支持表达式的注解 1.4     方法权限控制的拦截器 1.4.1    MethodSecurityInterceptor 1.4.2    AspectJMethodSecurityInterceptor 之前介绍的都是基于URL

Spring Security应用开发(02)基于XML配置的用户登录

1.1. 基于XML配置的登录功能 经过一系列配置之后,可以使用Spring Security内置功能实现最基本的用户登录功能以及角色验证功能,这种内置的功能没有任何实用价值,仅仅用于了解Spring Security的工作方式. (1)配置web.xml. 主要是为Spring MVC和Spring Security提供一些入口,以便有机会进行Spring MVC以及Spring Security的初始化和过滤处理等工作. <servlet> <servlet-name>spri

Spring Security应用开发(14) 重要概念之授权相关概念

1.1.1. Secure Object Secure Object指的是一个Method Invovation 或者一个URL资源. 1.1.2. GrantedAuthority GrantedAuthority用于表达指定的用户获得的权限(即角色名称). public interface GrantedAuthority extends Serializable { //返回一个表达已经经过授权的字符串. //如果不符合授权条件则返回null. String getAuthority();

Spring Security OAuth2 开发指南。

官方原文:http://projects.spring.io/spring-security-oauth/docs/oauth2.html 翻译及修改补充:Alex Liao. Spring OAuth2.0 提供者实现原理: Spring OAuth2.0提供者实际上分为: 授权服务 Authorization Service. 资源服务 Resource Service. 虽然这两个提供者有时候可能存在同一个应用程序中,但在Spring Security OAuth中你可以把 他它们各自放在