Защита пружинных веб-сокетов с помощью удаленного сервера единого входа - PullRequest
0 голосов
/ 17 сентября 2018

Я использую архитектуру микросервисов, поэтому у меня есть отдельная служба единого входа, которая обрабатывает все запросы на проверку подлинности и авторизацию.

Я использую пружинные веб-сокеты в другой службе, и мне нужно защитить ее с помощью токенов, обрабатываемых SSO,поэтому я добавил эту конфигурацию для защиты веб-сокетов.

@Configuration
@EnableResourceServer
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
    messages
            .nullDestMatcher().authenticated()
            .simpTypeMatchers(CONNECT).authenticated()
            .simpDestMatchers("/ws/**").hasRole("USER")
            .simpSubscribeDestMatchers("/ws/**").hasRole("USER")
            .anyMessage().denyAll();
}

@Override
protected boolean sameOriginDisabled() {
    return true;
}

}

и для конфигурации веб-сокета

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/ws/topic");
    config.setApplicationDestinationPrefixes("/ws/view");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/socket/").withSockJS();
}
}

и для удаленного сервера единого входа

@Override
public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/api/**").permitAll()
            .antMatchers("/api/**").access("#oauth2.hasScope('service-name')");
    http.csrf().disable();
    http.httpBasic().disable();
}

@Bean
@Primary
@RefreshScope
public CachedRemoteTokenService tokenServices() {
    final CachedRemoteTokenService remoteTokenServices = new CachedRemoteTokenService();
    remoteTokenServices.setCheckTokenEndpointUrl(getCheckTokenEndPointUrl());
    remoteTokenServices.setClientId(getClientId());
    remoteTokenServices.setClientSecret(getClientSecret());
    return remoteTokenServices;
}

я добавил токен вклиент, но он выдает AccessDeniedException

var headers = {
    Authorization: 'Bearer ' + myToken
}
stompClient.send("/ws/view/update/", headers, JSON.stringify(view));

Я проверил логи сервера SSO и обнаружил, что он вообще не вызывается!Чего-то не хватает?

Буду признателен за любую помощь

1 Ответ

0 голосов
/ 17 сентября 2018

Я использовал этот учебник, и он работает для меня.Вы можете выполнить следующие шаги: Введение в безопасность и WebSockets

...