本文介绍了ServerRequest在WebFlux请求处理程序中返回空主体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在一个Spring WebFlux应用程序中设置了身份验证。身份验证机制似乎运行得很好。例如,以下代码用于设置安全Web筛选器链:

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {

    return http.authorizeExchange()
            .pathMatchers("/path/to/resource").hasAuthority("A_ROLE")
            .anyExchange().authenticated()
            .and().httpBasic()
            .and().build();
}

这与UserDetailsRepositoryReactiveAuthenticationManager和MapReactive UserDetailsService一起工作,这是预期的。如果用户没有所需的权限,则返回禁止的错误代码,否则请求将传递给处理程序。

我要求在处理程序本身内应用细粒度的权限检查,并认为我应该能够从请求中检索授权,如下所示:

public Mono<ServerResponse> getMyResource(ServerRequest serverRequest) {

      Authentication authentication = (Authentication)serverRequest.principal().block();
      ...   
}

但是,我发现主体始终为空。首先,这是控制当局的正确方式吗?如果是这样的话,我是否可能遗漏了一些上游配置?

推荐答案

您在结果可用之前阻止了结果。您只需对其进行平面映射,即可不必阻止它。

public Mono<ServerResponse> getMyResource(ServerRequest serverRequest) {
    return serverRequest.principal().flatMap((principal) -> ServerResponse.ok()
            .body(fromObject("Hello " + principal.getName())));
}

更新:如果要检索主体和正文,可以压缩它们。

public Mono<ServerResponse> getMyResource(ServerRequest serverRequest) {
    return Mono.zip(
            serverRequest.principal(),
            serverRequest.bodyToMono(String.class)
    ).flatMap(tuple -> {
        Principal principal = tuple.getT1();
        String body = tuple.getT2();
        return ServerResponse.ok().build();
    });
}

这篇关于ServerRequest在WebFlux请求处理程序中返回空主体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-25 01:41