SpringInAction学习笔记——第14章 保护方法应用

来源:互联网 发布:app相册制作软件 编辑:程序博客网 时间:2024/05/17 22:53

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方法

阅读全文
0 0