WebSocketConfig.java:
Код: Выделить всё
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/stomp")
.setAllowedOrigins("*")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/topic", "/queue")
.setRelayHost("relayhost.mydomain.com")
.setRelayPort(61613);
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.setInterceptors(new MySubscriptionInterceptor());
}
}
Код: Выделить всё
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages
.simpSubscribeDestMatchers("/stomp/**").authenticated()
.simpSubscribeDestMatchers("/user/queue/errors").authenticated()
.anyMessage().denyAll();
}
}
Код: Выделить всё
public class MySubscriptionInterceptor extends ChannelInterceptorAdapter {
@Override
public Message preSend(Message message, MessageChannel channel) {
StompHeaderAccessor headerAccessor= StompHeaderAccessor.wrap(message);
Principal principal = headerAccessor.getUser();
if (StompCommand.SUBSCRIBE.equals(headerAccessor.getCommand())) {
checkPermissions(principal);
}
return message;
}
private void checkPermissions(Principal principal) {
// apply permissions logic
// throw Exception permissions not sufficient
}
}
Я пробовал подписаться на пользователей/{subscribeingUsername}/queue/errors< /code> и просто пользователи/очередь/ошибки с моим тестовым клиентом Java после его успешного подключения, но до сих пор мне не удалось получить сообщение об ошибке об исключении подписки с сервера, доставленное клиенту. . Это явно не идеально, поскольку клиенты никогда не уведомляются о том, что им отказано в доступе.
Источник: https://stackoverflow.com/questions/337 ... -websocket