Spring security webflux请求处理程序中的ServerRequest返回null主体

Spring security webflux请求处理程序中的ServerRequest返回null主体,spring-security,spring-webflux,Spring Security,Spring Webflux,我已经在SpringWebFlux应用程序中设置了身份验证。身份验证机制似乎工作正常。例如,以下代码用于设置安全web筛选器链: @Bean public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { return http.authorizeExchange() .pathMatchers("/path/to/resource").hasAuthority("A

我已经在SpringWebFlux应用程序中设置了身份验证。身份验证机制似乎工作正常。例如,以下代码用于设置安全web筛选器链:

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {

    return http.authorizeExchange()
            .pathMatchers("/path/to/resource").hasAuthority("A_ROLE")
            .anyExchange().authenticated()
            .and().httpBasic()
            .and().build();
}
这与UserDetailsRepositoryReactiveAuthenticationManager和MapReactiveUserDetailsService配合使用时,可以正常工作。如果用户没有所需的权限,将返回禁止的错误代码,否则请求将传递给处理程序

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

public Mono<ServerResponse> getMyResource(ServerRequest serverRequest) {

      Authentication authentication = (Authentication)serverRequest.principal().block();
      ...   
}
公共Mono getMyResource(服务器请求服务器请求){ 身份验证=(身份验证)serverRequest.principal().block(); ... }
然而,我发现主体总是空的。首先,这是处理权限的正确方法吗?如果是的话,我是否可能缺少一些上游配置?

您在结果可用之前阻止了它。您可以简单地对其进行平面映射,这样就不必阻止它

public Mono<ServerResponse> getMyResource(ServerRequest serverRequest) {
    return serverRequest.principal().flatMap((principal) -> ServerResponse.ok()
            .body(fromObject("Hello " + principal.getName())));
}
公共Mono getMyResource(服务器请求服务器请求){ 返回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();
    });
}
公共Mono getMyResource(服务器请求服务器请求){ 返回Mono.zip( serverRequest.principal(), serverRequest.BodyToNo(String.class) ).flatMap(元组->{ Principal=tuple.getT1(); 字符串体=tuple.getT2(); 返回ServerResponse.ok().build(); }); }
请告诉我如何从请求中检索
principal.getName()
和之后执行
bodyToMono
,如果我想使用登录名和body对象工作?;