我尝试使用路由器和处理程序类制作 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")
现在已弃用。
侃侃尔雅
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()));
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();
添加回答
举报
0/150
提交
取消