【发布时间】:2023-03-23 02:15:02
【问题描述】:
我在我的项目中使用 Spring Boot、Spring Security Oauth 和 Spring Security,这是一个 REST 服务器,从它的控制器方法返回 ResponseEntity<>。
现在,当我将@PostFilter 注释添加到返回ResponseEntity<Iterable<WebUser>> 的控制器方法时,随后执行会失败,因为方法filter(Object filterTarget, Expression filterExpression, EvaluationContext ctx) 只能处理Collection 和Array 类型的对象。无法从 ResponseEntity 中提取集合。
现在我的答案是扩展 DefaultMethodSecurityExpressionHandler 实现过滤器方法,从 ResponseEntity 中提取并通过扩展 GlobalMethodSecurityConfiguration 并覆盖 createExpressionHandler() 方法的 @EnableGlobalMethodSecurity 类来使用它。
如果我不使用 Spring Security OAuth,上述方法会起作用,因为我发现OAuth2MethodSecurityConfiguration 创建了自己的OAuth2MethodSecurityExpressionHandler,然后我的自定义一个没有创建。
解决方案是将整个 OAuth2MethodSecurityConfiguration 类复制到我的项目中并更改一行以使其创建提取 ResponseEntity 的 MyOAuth2MethodSecurityExpressionHandler extends OAuth2MethodSecurityExpressionHandler 但这个解决方案对我来说似乎有点 hacky。
所以,最后我想问一下是否有更好的方法来解决这个问题。也许我从一个不好的角度去解决它,错过了一个更直接的解决方案。
编辑:解决这个问题当然也是一种选择,但我主要是在寻找其他(更干净的)配置 Spring @PostFilter 以与 ResponseEntity (如果有的话)一起工作的方法,以更好地理解 Spring Boot 为整个。
【问题讨论】:
标签: spring spring-security spring-security-oauth2 spring-security-acl