为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕村225694 2023-03-09 17:18:51
我尝试使用路由器和处理程序类制作 Spring WebFlux 安全应用程序。首先,下面的代码是WebFlux安全的配置代码。@Configuration@EnableWebFluxSecuritypublic 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@EnableWebFluxpublic 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);    }    因为我做了WebFlux安全配置,肯定有一些WebClient不能执行和禁止的,如下图,Login : UnauthorizedUser Creation: Forbidden我不使用 cURL。所以我想知道的是我的WebClient方法是什么,必须在其中找到用户名和密码并将其转移到WebClient课堂上。任何答复将不胜感激。
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

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

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

以前使用 的方法.filter(basicAuthentication("user", "password")现在已弃用。


查看完整回答
反对 回复 2023-03-09
?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

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

将 Basic Auth 标头添加到客户端中的每个调用,如下所示:

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()));



查看完整回答
反对 回复 2023-03-09
?
GCT1015

TA贡献1827条经验 获得超4个赞

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


Authorization您可以使用较少的自定义编码设置标头来获得相同的结果。


请从 spring 文档中查看下面的代码片段:


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


    WebClient client = WebClient.builder()

            .filter(basicAuthentication("user", "password"))

            .build();


查看完整回答
反对 回复 2023-03-09
  • 3 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信