我最近写了一篇关于如何在 RSocket 中使用 Spring Security Basic Authentication 的文章。对于您的第一个问题,您可以TcpClientTransport.create(TcpClient.create().port(7000).secure())
在连接到时使用RSocketServer
。
RSocketRequester.builder()
.dataMimeType(MimeTypeUtils.APPLICATION_JSON)
.rsocketStrategies(rSocketStrategies)
.rsocketFactory(clientRSocketFactory -> {
clientRSocketFactory.frameDecoder(PayloadDecoder.ZERO_COPY);
})
.setupMetadata(credentials, UsernamePasswordMetadata.BASIC_AUTHENTICATION_MIME_TYPE)
.connect(TcpClientTransport.create(TcpClient.create().port(7000).secure()))
.block();
对于第二个问题,当访问 RSocket 消息端点时,您可以使用
BearerTokenMetadata credentials = new BearerTokenMetadata("jwt-token");
return rSocketRequester
.route("taxis")
.metadata(credentials, BearerTokenMetadata.BEARER_AUTHENTICATION_MIME_TYPE)
.data(new TaxisRequest(type, from, to))
.retrieveMono(TaxisResponse.class);
在 RSocketServer 设置期间,PayloadSocketAcceptorInterceptor
您可以使用jwt
如下。
@Bean
public PayloadSocketAcceptorInterceptor rsocketInterceptor(RSocketSecurity rsocket) {
rsocket.authorizePayload(authorize -> {
authorize
// must have ROLE_SETUP to make connection
.setup().hasRole("SETUP")
// must have ROLE_ADMIN for routes starting with "taxis."
.route("taxis*").hasRole("ADMIN")
// any other request must be authenticated for
.anyRequest().authenticated();
})
.jwt(Customizer.withDefaults());
return rsocket.build();
}