我尝试用路由器和处理程序类来创建spring webflux安全应用程序。首先,以下代码是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);
}
}
甚至网络也是rest web服务,但我使用WebFlux的WebClient类。
public void functionOnUserDocument() {
client.get().uri("/route/user/all").accept(MediaType.APPLICATION_JSON).exchange()
.flatMapMany(response -> response.bodyToFlux(User.class))
.subscribe(u -> System.out.println("All Users : " + u.getUsername() + ":" + u.getEmail() + ":" + u.getFullname()));
client.get().uri("/route/user/id/{id}", "0002").accept(MediaType.APPLICATION_JSON).exchange()
.flatMap(response -> response.bodyToMono(User.class))
.subscribe(u -> System.out.println("GET by Id : " + u.getUsername() + ":" + u.getEmail() + ":" + u.getFullname()));
client.get().uri("/route/user/username/{username}", "jina").accept(MediaType.APPLICATION_JSON).exchange()
.flatMap(response -> response.bodyToMono(User.class))
.subscribe(u -> System.out.println("Get by username : " + u.getUsername() + ":" + u.getEmail() + ":" + u.getFullname()));
client.get().uri("/route/user/email/{email}", "myson@college.ac.kr").accept(MediaType.APPLICATION_JSON).exchange()
.flatMap(response -> response.bodyToMono(User.class))
.subscribe(u -> System.out.println("Get By Email : " + u.getUsername() + ":" + u.getEmail() + ":" + u.getFullname()));
client.get().uri("/route/user/login/{username}/{password}", "julian", "password").exchange()
.map(ClientResponse::statusCode).subscribe(response -> System.out.println("Login : " + response.getReasonPhrase()));
User user = new User("0005", 4L, "jane", "password", "aaa@bbb.com", "누나", "USER");
client.post().uri("/route/user/create").body(Mono.just(user), User.class).exchange()
.map(ClientResponse::statusCode).subscribe(response -> System.out.println("User Creation: " + response.getReasonPhrase()));
}
由于我进行了webflux安全配置,某些webclient肯定无法执行和禁止,如下所示,
Login : Unauthorized
User Creation: Forbidden
我不使用curl。所以我想知道我的WebClient方法是什么,用户名和密码必须在哪里找到并转移到WebClient类。任何回复都将是感激的。
Spring提供了API,用于通过ClientFilters向WebClient提供基本的身份验证参数。
使用更少的自定义编码设置Authoration
头可以达到相同的结果。
请参阅以下spring文档中的代码片段:
import static org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication;
WebClient client = WebClient.builder()
.filter(basicAuthentication("user", "password"))
.build();
HTTP基本身份验证要求在授权
标题中使用Base64格式编码的用户名和密码。此外,您不需要有登录endpoint,因为每个请求都应该发送此信息。
将基本身份验证头添加到客户端中的每个调用中,如下所示:
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 5.1开始,您应该使用HttpHeaders#setBasicAuth
设置基本身份验证,如下所示:
webClient
.get()
.uri("https://example.com")
.headers(headers -> headers.setBasicAuth("username", "password"))
.exchange()
....
以前的方法,使用. Filter(basic验证("用户","密码")
,现在不建议使用。
我有麻烦管理詹金斯的秘密密码。我希望密码不显示在日志上,但我尝试了两种方法没有成功: 第一次尝试 我尝试使用全局凭据(不受限制)设置用户和pwd,如下所示: 我执行了: 但我可以在日志中看到,用户的写入是正确的,但pwd的写入方式与它的路径相同: 在我的自动测试中,也是通过输入完整路径而不是变量的值。 第二次尝试 我试着用这样的密文: 但控制台日志上显示的是原样的密码。 有人能帮我吗? 先谢谢你。
用户名和密码的来源 在章节中,用户详细信息保存在用户文件中。 FreeRADIUS使用此文件的内容以在身份验证过程中验证凭据。 FreeRADIUS通常是企业基础设施的一部分,而企业已经在其他地方创建了已有用户。 本章将介绍如何使用现有的用户存储。 在本章中,我们将: 查看用户商店选项 使用Linux系统用户作为FreeRADIUS的用户存储 使用MySQL作为FreeRADIUS的用户存储 使用
我正在使用cloudera VM,我想连接到beeline,但当我离开时,它询问用户名和密码,它没有连接。谁能告诉我用户名和密码。 !连接JDBC:hive2://localhost:10000/连接到JDBC:hive2://localhost:10000/输入JDBC:hive2://localhost:10000/输入JDBC:hive2://localhost:10000/输入密码:错误:
数据供应商为使用其SFTP服务器请求了公共SSH密钥。他们向我们提供了: 用户名 密码 主机名 端口 我正在尝试使用私钥和用户名/密码在php中使用流包装器。我的代码如下: 有人有什么想法吗? 我对使用ssh2函数的想法持开放态度,但我强烈希望使用文件系统和流函数。
我将jenkins安装到windows 10。当我访问http://localhost:8080/,我必须输入用户名和密码。 但我不会像截图显示的那样显示秘密文件夹: 在包含jenkins.war的路径文件夹中运行时,我得到了这个异常 你能帮我解决那个问题吗?。 如有任何建议,将不胜感激。提前谢谢。
在这里的Spring WebClient教程之后,我将尝试将请求正文中的用户名和密码(无基本身份验证)传递给APIendpoint,因为它期望这些参数。 我在Postman中进行了测试,在正文中提供用户名和密码作为单独的字段,并将contentType设置为application/x-www-form-urlencoded。这会得到预期的令牌,但是当我使用WebClient实现打印下面的响应时,它