【发布时间】:2017-12-19 20:36:44
【问题描述】:
我有 websocket 配置类:
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topics");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/notifications").setAllowedOrigins("*").withSockJS();
}
还有ClientInboundChannel:
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.setInterceptors(new ChannelInterceptorAdapter() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
final String xAuthToken = accessor.getFirstNativeHeader(ManipulatesHeaders.X_AUTH_TOKEN_HEADER);
if (xAuthToken == null) {
return message;
}
final UserDetails userDetails = authService.getUserDetails(xAuthToken);
if (StompCommand.CONNECT == accessor.getCommand()) {
final WebSocketPrincipal principal = (...)
userRegistry.registerUser(principal, message);
accessor.setUser(principal);
}
return message;
}
}
}
现在,我想向订阅特定频道的每个用户发送欢迎消息。很明显,可以通过创建一个实现ApplicationListener<SessionSubscribeEvent>并提供的类来实现
@Override
public void onApplicationEvent(final SessionSubscribeEventevent) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
}
第二种方法是在前面提到的ClientInboundChannel中执行类似的事情(相同)。
问题是,当用户发送单脚SUBSCRIBE 时,message 中没有 simpUser 标头。
流程如下:用户发送stompCONNECT,执行此行:accessor.setUser(principal),此时message已正确设置simpUser标头。但是当在preSend 中接收到stomp SUBSCRIBE 消息时,StompHeaderAccessor 没有simpUser 标头。因此,我无法评估用户是否已经过身份验证。
那么我如何检查发送SUBSCRIBE 消息的用户是否已经通过身份验证? (以及为什么经过身份验证的用户不发送simpUser 标头)
【问题讨论】:
标签: java spring spring-mvc websocket spring-websocket