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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值