package ru.digitalbanana.demoresourceserver.config; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.simp.config.ChannelRegistration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.messaging.simp.stomp.StompCommand; import org.springframework.messaging.simp.stomp.StompHeaderAccessor; import org.springframework.messaging.support.ChannelInterceptor; import org.springframework.messaging.support.MessageHeaderAccessor; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.security.oauth2.jwt.JwtDecoder; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration; /** * Web Socket configuration * Created by dima on 8/12/16. */ @Configuration @Order(Ordered.HIGHEST_PRECEDENCE + 99) @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Autowired private JwtDecoder jwtDecoder; @Override public void configureClientInboundChannel(ChannelRegistration registration) { registration.interceptors(new ChannelInterceptor() { @Override public Message preSend(Message message, MessageChannel channel) { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); if (accessor!=null && StompCommand.CONNECT.equals(accessor.getCommand())) { List authorization = accessor.getNativeHeader("Authorization"); String accessToken = authorization != null ? authorization.get(0).split(" ")[1] : ""; Jwt jwt = jwtDecoder.decode(accessToken); JwtAuthenticationConverter converter = new JwtAuthenticationConverter(); Authentication authentication = converter.convert(jwt); accessor.setUser(authentication); } return message; } }); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/simple"); registry.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry .addEndpoint("/ws") .setAllowedOriginPatterns("*") .withSockJS(); } @Override public void configureWebSocketTransport(WebSocketTransportRegistration registration) { registration.setSendBufferSizeLimit(1024 * 512 * 1024); // default : 512 * 1024 } }