3

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

现在,当我将@PostFilter注释添加到返回ResponseEntity<Iterable<WebUser>>执行随后失败的控制器方法时,因为方法filter(Object filterTarget, Expression filterExpression, EvaluationContext ctx)只能与类型CollectionArray. 它无法从 ResponseEntity 中提取集合。

现在我的答案是通过DefaultMethodSecurityExpressionHandler从 ResponseEntity 中提取并通过扩展和覆盖该方法的@EnableGlobalMethodSecurity类来使用它来扩展实现过滤器方法。GlobalMethodSecurityConfigurationcreateExpressionHandler()

如果我不使用 Spring Security OAuth,上面的方法会起作用,因为我发现OAuth2MethodSecurityConfiguration创建它自己的OAuth2MethodSecurityExpressionHandler并且我的自定义的然后没有被创建。

解决方案是将整个OAuth2MethodSecurityConfiguration类复制到我的项目中并更改一行以使其创建MyOAuth2MethodSecurityExpressionHandler extends OAuth2MethodSecurityExpressionHandler提取的ResponseEntity但这个解决方案对我来说似乎有点 hacky。

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

编辑:解决这个问题当然也是一种选择,但我主要是在寻找其他(更清洁)的方式来配置 Spring @PostFilter 以与 ResponseEntity<> (如果有的话)一起更好地理解 Spring Boot 的整体。

4

1 回答 1

1

在服务级别过滤数据

@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)
}
于 2016-01-19T09:06:06.257 回答