es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo combinar spring websockets habilitados y deshabilitados para csrf en una aplicación

Tengo una aplicación en la que necesito dos configuraciones de websocket diferentes:

  1. Una para permitir la comunicación entre la aplicación y los clientes remotos basados ​​en Java
    • Utiliza comunicaciones sin estado (el token de autenticación se incluye en cada solicitud, también en la solicitud de conexión del websocket)
    • Se debe deshabilitar csrf
  2. Una para permitir notificaciones push asíncronas desde la aplicación a su propia interfaz de usuario web.
    • Utiliza autenticación de sesión normal
    • Se debe habilitar csrf, o preferiblemente debe habilitarse (¡corríjame si me equivoco?)

Ahora bien, en Spring, para deshabilitar la verificación de origen cruzado para los websockets, es necesario extender “AbstractSecurityWebSocketMessageBrokerConfigurer”, por ejemplo, de la siguiente manera:

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

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

}

La pregunta es, ¿cómo puedo deshabilitarlo para algunos websockets y habilitarlo para otros?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para habilitar/deshabilitar la verificación de origen cruzado para websockets específicos, puedes utilizar el método configureClientInboundChannel en la clase WebSocketSecurityConfig. Aquí tienes un ejemplo:

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
    
        @Override
        protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
            messages.anyMessage().authenticated();
        }
    
        @Override
        protected void configureClientInboundChannel(ChannelRegistration registration) {
            registration.interceptors(new ChannelInterceptorAdapter() {
                @Override
                public Message<?> preSend(Message<?> message, MessageChannel channel) {
                    StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
    
                    if (accessor.getCommand() == StompCommand.CONNECT || accessor.getCommand() == StompCommand.SUBSCRIBE) {
                        if (accessor.getNativeHeader("destination").get(0).startsWith("/topic/")) {
                            accessor.setSystemHeartbeatSendInterval(5000);
                            accessor.setSystemHeartbeatReceiveInterval(5000);
                        } else if (accessor.getNativeHeader("destination").get(0).startsWith("/user/")) {
                            accessor.setSystemHeartbeatSendInterval(50000);
                            accessor.setSystemHeartbeatReceiveInterval(50000);
                        }
                    }
    
                    return message;
                }
            });
        }
    
        @Override
        protected boolean sameOriginDisabled() {
            return false;
        }
    }
    

    En el código anterior, estamos utilizando ChannelInterceptorAdapter para interceptar los mensajes entrantes y establecer selectivamente los intervalos de envío y recepción de latido del sistema en función del encabezado de destino. Puedes utilizar este enfoque para habilitar/deshabilitar selectivamente la verificación de origen cruzado para websockets específicos según tus requisitos.

Comments are closed.