3

对于微服务到微服务的通信,RSocket 似乎是 HTTP/S 的一个不错的替代方案。幸运的是,Spring Boot 已经有一个平滑的集成,可以简化它的配置。

但是,我在 RSocket 和 Spring (Boot, Security) 文档中都缺少有关 RSocket 安全性的所有信息。

我的问题是:

1)我们如何配置 RSocket 以使用 TLS(在 Spring Boot 应用程序的上下文中)?

2) Spring Security 是否为 RSocket 安全性添加了任何附加功能?我想到的事情,假设我们想将 JWT 令牌从一个应用程序传播到另一个应用程序,它如何通过 RSocket 传递和验证?

4

1 回答 1

5

我最近写了一篇关于如何在 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();
        }
于 2019-09-30T05:46:32.817 回答