Spring security SpringWebFlux的WebClient的用户名和密码放在哪里?

Spring security SpringWebFlux的WebClient的用户名和密码放在哪里?,spring-security,spring-webflux,Spring Security,Spring Webflux,我尝试使用路由器和处理程序类来创建SpringWebFlux安全应用程序。首先,以下代码是webflux security的配置代码 @Configuration @EnableWebFluxSecurity public class BlogWebFluxSecurityConfig { @Bean public MapReactiveUserDetailsService userDetailsService() { UserDetails userWebF

我尝试使用路由器和处理程序类来创建SpringWebFlux安全应用程序。首先,以下代码是webflux security的配置代码

@Configuration
@EnableWebFluxSecurity
public class BlogWebFluxSecurityConfig {

    @Bean
    public MapReactiveUserDetailsService userDetailsService() {

        UserDetails userWebFlux = User.withUsername("joseph").password("password").roles("USER").build();
        return new MapReactiveUserDetailsService(userWebFlux);
    }

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http
        .authorizeExchange()
        .pathMatchers("/route/user/all", "/route/post/all").permitAll()
        .pathMatchers(HttpMethod.GET, "/route/user/**", "/route/post/**").hasRole("USER")
        .anyExchange().authenticated()
        .and()
        .httpBasic();

        return http.build();
    } 
}
接下来的代码是关于路由器类的

@Configuration
@EnableWebFlux
public class BlogWebFluxEndpointRouter {

    @Bean
    public RouterFunction<ServerResponse> routesUser(UserHandler handler) {

        return RouterFunctions.route(RequestPredicates.GET("/route/user/all"), handler::findAll)
                    .andRoute(RequestPredicates.GET("/route/user/id/{id}"), handler::findById)
                    .andRoute(RequestPredicates.GET("/route/user/username/{username}"), handler::findByUsername)
                    .andRoute(RequestPredicates.GET("/route/user/email/{email}"), handler::findByEmail)
                    .andRoute(RequestPredicates.POST("/route/user/create"), handler::register)
                    .andRoute(RequestPredicates.GET("/route/user/login/{username}/{password}"), handler::authenticate);
    }

    @Bean
    public RouterFunction<ServerResponse> routesPost(PostHandler handler) {

        return RouterFunctions.route(RequestPredicates.GET("/route/post/all"), handler::findAll)
                    .andRoute(RequestPredicates.GET("/route/post/id/{id}"), handler::findById)
                    .andRoute(RequestPredicates.GET("/route/post/delete/{id}"), handler::deleteById)
                    .andRoute(RequestPredicates.POST("/route/post/create"), handler::create)
                    .andRoute(RequestPredicates.PUT("/route/post/{id}/{content}"), handler::edit);
    }
}
由于我进行了webflux安全配置,某些webclient肯定无法执行和禁止,如下所示

Login : Unauthorized
User Creation: Forbidden

我不用卷发。所以我想知道的是我的WebClient方法是什么,用户名和密码必须在哪里,并转移到WebClient类。任何答复都将不胜感激

HTTP基本身份验证需要在
Authorization
头中以Base64格式编码的用户名和密码。此外,您不需要有登录端点,因为此信息应该随每个请求一起发送

将基本身份验证标头添加到客户端中的每个调用中,如下所示:

String basicAuthHeader = "basic " + Base64Utils.encodeToString((username + ":" + password).getBytes())

client.get().uri("/route/user/all")
      .accept(MediaType.APPLICATION_JSON)
      .header(HttpHeaders.AUTHORIZATION, basicAuthHeader)
      .exchange()
      .flatMapMany(response -> response.bodyToFlux(User.class))
      .subscribe(u -> System.out.println("All Users : " + u.getUsername() + ":" + u.getEmail() + ":" + u.getFullname()));

HTTP基本身份验证要求在
Authorization
标头中使用Base64格式编码的用户名和密码。此外,您不需要有登录端点,因为此信息应该随每个请求一起发送

将基本身份验证标头添加到客户端中的每个调用中,如下所示:

String basicAuthHeader = "basic " + Base64Utils.encodeToString((username + ":" + password).getBytes())

client.get().uri("/route/user/all")
      .accept(MediaType.APPLICATION_JSON)
      .header(HttpHeaders.AUTHORIZATION, basicAuthHeader)
      .exchange()
      .flatMapMany(response -> response.bodyToFlux(User.class))
      .subscribe(u -> System.out.println("All Users : " + u.getUsername() + ":" + u.getEmail() + ":" + u.getFullname()));

Spring提供了API,用于通过向WebClient提供基本身份验证参数

您可以使用较少的自定义编码设置
授权
标题,从而获得相同的结果

请参阅以下spring文档中的代码片段:

import static org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication;

    WebClient client = WebClient.builder()
            .filter(basicAuthentication("user", "password"))
            .build();

Spring提供了API,用于通过向WebClient提供基本身份验证参数

您可以使用较少的自定义编码设置
授权
标题,从而获得相同的结果

请参阅以下spring文档中的代码片段:

import static org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication;

    WebClient client = WebClient.builder()
            .filter(basicAuthentication("user", "password"))
            .build();

从spring 5.1开始,您应该设置基本身份验证,如下所示:

webClient
    .get()
    .uri("https://example.com")
    .headers(headers -> headers.setBasicAuth("username", "password"))
    .exchange()
    ....

以前使用的方法现在已被弃用。

从spring 5.1开始,您应该使用设置基本身份验证,如下所示:

webClient
    .get()
    .uri("https://example.com")
    .headers(headers -> headers.setBasicAuth("username", "password"))
    .exchange()
    ....

以前使用的方法现在已被弃用。

您的代码中有一些不好的地方,您永远不会在webflux应用程序中订阅,因此需要删除所有
subscribe
。我不知道你的问题是什么。当人们呼叫您的服务时,或者当您的服务呼叫另一个服务时,会发生这种情况吗?谢谢您的回复。你是说我的消息来源的哪一部分有不好的东西?路由器还是网络客户端?请告知我参考网站以及我的错误。您的服务是
出版商
,所有呼叫它的客户都是
订阅者
。因此,您不应使用
订阅
您不应使用
/route/user/login/{username}/{password}
这将通过internet免费发送用户名和密码,让每个人都可以看到您的代码中有一些不好的东西,您从不在webflux应用程序中订阅,因此所有
订阅
都需要删除。我不知道你的问题是什么。当人们呼叫您的服务时,或者当您的服务呼叫另一个服务时,会发生这种情况吗?谢谢您的回复。你是说我的消息来源的哪一部分有不好的东西?路由器还是网络客户端?请告知我参考网站以及我的错误。您的服务是
出版商
,所有呼叫它的客户都是
订阅者
。因此,您不应使用
订阅
您不应使用
/route/user/login/{username}/{password}
这将通过internet免费发送用户名和密码,供所有人查看