package alien4cloud.rest.websocket;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.messaging.support.ChannelInterceptorAdapter;
import org.springframework.stereotype.Component;
@Slf4j
@Component("webSocketTopicSubscriptionInterceptor")
public class WebSocketTopicSubscriptionInterceptor extends ChannelInterceptorAdapter {
@Resource
private ISecuredHandler[] handlers;
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(message);
if (StompCommand.SUBSCRIBE.equals(headerAccessor.getCommand())) {
String destination = headerAccessor.getDestination();
for (ISecuredHandler handler : handlers) {
if (handler.canHandleDestination(destination)) {
handler.checkAuthorization(headerAccessor.getUser(), destination);
}
}
}
return message;
}
}