gpt4 book ai didi

java - 订阅 channel 时如何检查websocket用户是否经过身份验证?

转载 作者:行者123 更新时间:2023-12-02 11:50:38 25 4
gpt4 key购买 nike

我有 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;
}
}
}

现在,我想向每个订阅特定 channel 的用户发送一条欢迎消息。很明显,它可以通过创建一个实现 ApplicationListener<SessionSubscribeEvent> 的类来实现并提供

@Override
public void onApplicationEvent(final SessionSubscribeEventevent) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
}

第二种方法是在上述 ClientInboundChannel 中执行类似的操作(是一样的)。

问题是,没有 simpUser message 中的 header 当用户发送践踏SUBSCRIBE时。

流程如下:用户发送stomp CONNECT ,执行此行:accessor.setUser(principal)此时message已正确设置 simpUser header 。但当跺脚SUBSCRIBE收到消息 preSendStompHeaderAccessor没有simpUser header 。因此我无法评估用户是否已经通过身份验证。

那么我如何检查用户是否发送了 SUBSCRIBE消息是否已通过身份验证? (以及为什么经过身份验证的用户不发送 simpUser header )

最佳答案

在您的 websocket 配置类中,将您的扩展更改为 AbstractSecurityWebSocketMessageBrokerConfigurer

然后您可以按如下方式设置安全性:

@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry message) {
message
.nullDestMatcher().permitAll()
.simpDestMatchers("/app/**").authenticated()
.simpSubscribeDestMatchers("/topics/**").authenticated()
.anyMessage().denyAll();
}

如果您收到错误无法验证提供的 CSRF token ,因为找不到您的 session 您必须覆盖 websocket 配置类中的 `sameOriginDisabled

  @Override
protected boolean sameOriginDisabled() {
return true;
}

有关 websocket 安全性的更多信息:

https://docs.spring.io/spring-security/site/docs/current/reference/html/websocket.html

关于java - 订阅 channel 时如何检查websocket用户是否经过身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47894811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com