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

问题描述 投票:0回答:2

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

ResponseEntity<>

现在,当我向返回

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

现在我的答案是通过从 ResponseEntity 中提取来扩展

DefaultMethodSecurityExpressionHandler
实现过滤器方法,并通过扩展
@EnableGlobalMethodSecurity
类并覆盖
GlobalMethodSecurityConfiguration
方法来使用它。

如果我不使用 Spring Security OAuth,上面的方法会起作用,因为我发现

createExpressionHandler()

创建了自己的

OAuth2MethodSecurityConfiguration
,而我的自定义的则不会被创建。

解决方案是将整个

OAuth2MethodSecurityExpressionHandler

类复制到我的项目中,并更改一行以使其创建提取

OAuth2MethodSecurityConfiguration
MyOAuth2MethodSecurityExpressionHandler extends OAuth2MethodSecurityExpressionHandler
,但这个解决方案对我来说似乎有点老套。

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

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

spring spring-security spring-security-oauth2 spring-security-acl
2个回答
1
投票

ResponseEntity

然后在控制器中

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



0
投票

代码如下所示:

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

无论你喜不喜欢,自己决定。

© www.soinside.com 2019 - 2024. All rights reserved.