作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,我需要两个不同的 websocket 设置:
现在,在 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/
我是一名优秀的程序员,十分优秀!