В моем весеннем загрузочном проекте у меня есть соединение 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 и создать отдельную тему для ошибок и позволить каждому пользователю подключаться туда?