我正在设置我的spring boot应用程序。我的应用程序存在的问题是,在春季安全认证失败后,WebSocket连接仍处于打开状态。 在此之前,我没有对用户进行身份验证,以便在非标准情况下测试应用程序。
我的配置要求CONNECT命令具有“ USER”角色。
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages
.nullDestMatcher().hasRole("USER")
.simpDestMatchers("/app/info").hasRole("USER")
.simpSubscribeDestMatchers("/user/queue/info").hasRole("USER")
.anyMessage().denyAll();
}
我希望在服务器端关闭连接,但是在客户端收到以下消息:
"<<< ERROR
content-length:0
message:Failed to send message to ExecutorSubscribableChannel[clientInboundChannel]; nested exception is org.springframework.security.access.AccessDeniedException\c Access is denied
content-length:0
...并且连接仍处于活动状态。
为确认连接处于活动状态,我使用了@EventListener
:
@EventListener
public void onDisconnectEvent(SessionDisconnectEvent event) {
// print debug message
}
...并在客户端手动关闭连接。我能够再次看到关闭的连接堆栈跟踪:
// print debug message
+
org.springframework.messaging.MessageDeliveryException: Failed to send message to ExecutorSubscribableChannel[clientInboundChannel]; nested exception is org.springframework.security.access.AccessDeniedException: Access is denied
at ...
我认为这是个问题,我不希望我的应用与数百个未经身份验证的套接字保持连接。