【问题标题】:Reactive Spring Security PostAuthorize annotation doesn't work反应式 Spring Security PostAuthorize 注释不起作用
【发布时间】:2020-10-25 14:36:02
【问题描述】:

使用Webflux和Reactive Spring Security,如何通过注解进行后期处理来控制对方法的访问?

尝试一个非常基本的示例,我无法从 PostAuthorize 注释中获取值。例如

  @GetMapping
  @PostAuthorize("#email == authentication.principal.email")
  public Flux<Project> sampleTest(final String email) {
    log.info("email: {}", email);

    return Flux.empty();
  }

电子邮件将始终为空。如果我设置@PreAuthorize("hasRole('ADMIN')") 之类的东西,我的基本接线就可以工作,我会得到一个 403。

我可以使用以下助手提取身份验证:

  public Mono<Authentication> getAuthentication() {
    return ReactiveSecurityContextHolder.getContext()
        .map(SecurityContext::getAuthentication)
        .flatMap(Mono::just);
  }

【问题讨论】:

    标签: spring-boot spring-security reactive


    【解决方案1】:

    我可能没有正确理解您的问题,但 PostAuthorize 使用了返回对象 - 方法的主体无法访问 SPEL 表达式中的任何内容。

    这样的事情可能会奏效-

    @GetMapping
      @PostAuthorize("returnObject == someCondition")
      public Flux<Project> sampleTest(final String email) {
        // get some data and return it
      }
    

    但也许您想过滤 Flux 中的项目?
    你可以看看@PostFilter注解-

    // assuming there's an email property on your Project object.
    @GetMapping
      @PostFilter("filterObject.getEmail() == authentication.principal.email")
      public Flux<Project> sampleTest() {
        // get some data and return it
      }
    

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 2013-12-28
      • 2018-02-22
      • 2012-01-01
      • 2011-10-05
      • 2014-08-14
      • 2015-09-20
      • 2015-01-01
      • 2015-10-26
      相关资源
      最近更新 更多