我在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();
}
这与UserDetailsRepositoryAuthenticationManager和MapReactiveUserDetailsService一起按预期工作。如果用户没有所需的权限,则返回禁用的错误代码,否则请求将传递给处理程序。
我需要在处理程序本身中应用细粒度权限检查,并且我发现我应该能够从请求中检索权限,如下所示:
public Mono<ServerResponse> getMyResource(ServerRequest serverRequest) {
Authentication authentication = (Authentication)serverRequest.principal().block();
...
}
但是,我发现主体始终为空。首先,这是获得当局处理的正确方法,如果是这样,我可能会缺少一些上游配置吗?
答案 0 :(得分:3)
您在结果可用之前阻止了结果。您可以简单地对其进行平面映射,以便您不必阻止它。
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();
});
}