Аутентификация Websocket не удалась - как отправить resposn клиенту - PullRequest
0 голосов
/ 12 декабря 2018

В моем весеннем загрузочном проекте у меня есть соединение websocket между клиентом и сервером.На пользовательском сайте сервера ChannelInterceptor Я переопределил preSend метод для аутентификации, когда команда stomp равна CONNECT .

Проблема

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

В момент, когда я не аутентифицирую пользователя, я получаю в клиентском приложении ниже сообщение в кадре StompSessionзаголовок:

Не удалось отправить сообщение в ExecutorSubscribeableChannel [clientInboundChannel];вложенным исключением является org.springframework.security.access.AccessDeniedException: доступ запрещен

Но я ожидаю, что есть информация, почему доступ запрещен, так, например, для ex. AuthenticationCredentialsNotFoundException или BadCredentialsException .

Перехватчик канала:

public class CustomChannelInterceptorAdapter implements ChannelInterceptor {

    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        StompHeaderAccessor accessor =
                MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
        if (accessor.getCommand().equals(StompCommand.CONNECT)) {

            WebSocketAuthenticatorService.getAuthenticatedOrFail(accessor.getLogin(), accessor.getPasscode());
            /*above and below line is just mind shortcut. getAuthenticatedOrFail will 
             return UsernamePasswordAuthenticationToken or throw specific exception 
             for ex. AuthenticationCredentialsNotFoundException or BadCredentialsException */
            if (userOK) {
                accessor.setUser(user);
            } else {
                // send response to client with exception thrown above
            }

        }
        return message;
    }
}

Охранные конфиги:

AbstractSecurityWebSocketMessageBroker30 *31

@Configuration
public class WebSocketAuthorizationSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

    @Override
    protected void configureInbound(final MessageSecurityMetadataSourceRegistry messages) {
        messages.anyMessage().authenticated();
    }
}
1031 * Configure

WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .httpBasic().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests().antMatchers("/register").permitAll()
                .and()
                .authorizeRequests().antMatchers("/gs-guide-websocket").permitAll()
                .and()
                .authorizeRequests().antMatchers("/actuator/info").permitAll()
                .anyRequest().denyAll();
    }

    @Bean
    public PasswordEncoder encoder() {
        return new BCryptPasswordEncoder(10);
    }
}

WebSocketMessageBrokerConfigurer

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE + 99)
public class WebSocketAuthenticationSecurityConfig implements WebSocketMessageBrokerConfigurer {

    @Autowired
    CustomChannelInterceptorAdapter customChannelInterceptorAdapter;

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(customChannelInterceptorAdapter);
    }
}

Вопрос

Можно ли вообще отправить это сообщение с информацией об исключении?

Илиможет быть, я должен использовать hasRole вместо authenticated in AbstractSecurityWebSocketMessageBrokerConfigurer и создать отдельную тему для ошибок и позволить каждому пользователю подключаться туда?

...