gpt4 book ai didi

java - 如何在一个应用程序中混合启用和禁用 csrf 的 spring websockets

转载 作者:行者123 更新时间:2023-12-05 05:50:59 24 4
gpt4 key购买 nike

我有一个应用程序,我需要两个不同的 websocket 设置:

  1. 一个用于允许应用程序和基于 Java 的远程客户端之间的通信
    • 使用无状态通信(授权 token 包含在每个请求中,也包含在 websocket 连接请求中)
    • 需要禁用csrf
  2. 一个允许从应用程序向其自己的 Web UI 异步推送通知。
    • 使用普通 session 验证
    • csrf 需要启用,或者最好启用(如果我错了请纠正我?)

现在,在 Spring 中,要禁用 websocket 的跨源检查,需要扩展 AbstractSecurityWebSocketMessageBrokerConfigurer,例如如下:

@Configuration
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
protected void configureInbound(final MessageSecurityMetadataSourceRegistry messages) {
messages.anyMessage().authenticated();
}

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

问题是,我怎样才能为某些 websocket 禁用它并为其他 websocket 启用它?

最佳答案

如果您查看方法 AbstractSecurityWebSocketMessageBrokerConfigurer#configureClientInboundChannel(ChannelRegistration),当您将 sameOriginDisabled 设置为 false 时,它只是注册一个CsrfChannelInterceptor:

if (!sameOriginDisabled()) {
registration.setInterceptors(this.context.getBean(CsrfChannelInterceptor.class));
}

然后,它调用 customizeClientInboundChannel(ChannelRegistration) 方法。

我现在无法测试,但我认为您可以覆盖方法 customizeClientInboundChannel(ChannelRegistration) 并执行以下操作:

@Override
protected void customizeClientInboundChannel(ChannelRegistration registration) {
registration.addInterceptor(myCustomCsrfChannelInterceptor());
}

private CsrfChannelInterceptor myCustomCsrfChannelInterceptor() {
return new MyCustomCsrfChannelInterceptor();
}

private static class MyCustomCsrfChannelInterceptor {
private MessageMatcher<Object> matcher = //create your MessageMatcher with your rules

@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
if (!this.matcher.matches(message)) {
return message;
}
//copy the content from `CsrfChannelInterceptor`
}
}

总而言之,您正在做的是创建一个自定义 CsrfChannelInterceptor,它将使用自定义 MessageMatcher 和您自己的规则来检查它是否应该应用于那个 Message,其余的只是原始拦截器的副本。

关于java - 如何在一个应用程序中混合启用和禁用 csrf 的 spring websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70446698/

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