如何在使用OAuth时为不同类型实现Spring Security @PostFilter

时间:2016-01-18 10:08:18

标签: spring spring-security spring-security-oauth2 spring-security-acl

我在我的项目中使用Spring Boot,Spring Security Oauth和Spring Security,这是一个REST服务器,从它的控制器方法返回ResponseEntity<>

现在,当我向返回@PostFilter的控制器方法添加ResponseEntity<Iterable<WebUser>>注释时,执行随后失败,因为方法filter(Object filterTarget, Expression filterExpression, EvaluationContext ctx)只能处理类型Collection和{{}的对象1}}。它无法从ResponseEntity中提取集合。

现在我的答案是扩展Array实现过滤器方法,从ResponseEntity中提取并使用扩展DefaultMethodSecurityExpressionHandler的{​​{1}}类并覆盖@EnableGlobalMethodSecurity方法来使用它

如果我不使用Spring Security OAuth,上面会有效,因为我发现GlobalMethodSecurityConfiguration创建了自己的createExpressionHandler(),然后我的自定义版本就不会被创建。

解决方案是将整个OAuth2MethodSecurityConfiguration类复制到我的项目中并更改一行以使其创建OAuth2MethodSecurityExpressionHandler,从而提取OAuth2MethodSecurityConfiguration,但这个解决方案对我来说似乎有些惹恼。

所以,最后我想询问是否有更好的方法来解决这个问题。也许我从一个不好的角度去做,错过了一个更简单的解决方案。

编辑:解决这个问题当然也是一个选择,但我主要是寻找其他(更清洁)的方法来配置Spring @PostFilter来处理ResponseEntity&lt;&gt; (如果有的话)更好地了解Spring Boot的整体情况。

1 个答案:

答案 0 :(得分:0)

在服务级别过滤数据

@Service
class TamasServiceImpl implement TamasService{
    @PostFilter
    public Iterable<TamasUser> loadAll(){
        // return you data here
    }
}

然后在控制器

@Autowired
TamasService service;

@Get
public ResponseEntity<Iterable<TamasUser>> loadAll(){
    return new ResponseEntity<>(service.loadAll(),HttpStatus.FOUND)
}