Как настроить безопасность RSocket в приложении Spring Boot с помощью Spring Security - PullRequest
0 голосов
/ 27 сентября 2019

RSocket, похоже, является хорошей альтернативой HTTP / S для микросервисной и микросервисной связи.К счастью, Spring Boot уже имеет плавную интеграцию, которая облегчает его настройку.

Однако мне не хватает информации обо всем, что связано с безопасностью RSocket, как в документации по RSocket, так и в Spring (Boot, Security).

Мои вопросы:

1) Как настроить RSocket для использования TLS (в контексте приложения Spring Boot)?

2) Добавляет ли Spring Security какие-либо дополнительные функции для безопасности RSocket??Вещи, которые приходят мне в голову, представьте, что мы хотим распространять токен JWT из одного приложения в другое, как его можно передать и проверить через RSocket?

1 Ответ

0 голосов
/ 30 сентября 2019

Недавно я написал сообщение о том, как использовать базовую аутентификацию Spring Security с RSocket.В качестве первого вопроса вы можете использовать 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();
        }
...