【问题标题】:How to implement Spring Security @PostFilter for different types when using OAuth使用 OAuth 时如何为不同类型实现 Spring Security @PostFilter
【发布时间】: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) 只能处理CollectionArray 类型的对象。无法从 ResponseEntity 中提取集合。

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

如果我不使用 Spring Security OAuth,上述方法会起作用,因为我发现OAuth2MethodSecurityConfiguration 创建了自己的OAuth2MethodSecurityExpressionHandler,然后我的自定义一个没有创建。

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

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

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

【问题讨论】:

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


    【解决方案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)
    }
    

    【讨论】:

    • 好主意 :) 我非常喜欢在控制器方法上添加安全注释,以至于我什至没有想到。但是在我们的团队中,我们同意在其中放置这些注释,我不会仅仅基于这个小问题来强制更改。我想找到一个更好、更简洁的解决方案来修改 @PostFilter 以使用 ResponseEntity.
    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2021-09-10
    • 1970-01-01
    • 2011-04-17
    • 2015-04-23
    相关资源
    最近更新 更多