Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

190
Vistas
Cómo evitar la suscripción a spring socket /queue/private/* destino.

Tengo una aplicación API de socket Java, que maneja las solicitudes de socket de los usuarios y envía respuestas. Tengo un configurador:

 @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { private static final Logger LOGGER = Logger.getLogger(WebSocketConfig.class); @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/queue"); config.setApplicationDestinationPrefixes("/server_in"); config.setUserDestinationPrefix("/user"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/websocket").withSockJS(); } }

Cuando envío una respuesta al usuario, hago lo siguiente: this.simpMessagingTemplate.convertAndSend("/queue/private/user_"+secret_key, socketResponse);

En el cliente tengo el siguiente código:

 sc.subscribe('/queue/private/user_'+secret_key, function (greeting) { console.log(greeting.body); });

Y la respuesta se maneja con éxito. Pero el problema es que algún otro usuario también puede suscribirse al destino "/queue/private/*" y manejar mensajes privados.

 sc.subscribe('/queue/private/*', function (greeting) { console.log(greeting.body); });

¿Cómo puedo prevenir ese comportamiento?

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Si desea que cada usuario tenga un socket y solo reciba mensajes, lo que puede hacer es:

Suscríbase como lo hace al punto final pero con "/ usuario" al frente, por ejemplo

 sc.subscribe('/user/queue/websocket, function (greeting) { console.log(greeting.body); });

y en el lado del servidor deberías tener un método de descanso:

 @RequestMapping(value = "/test", method = RequestMethod.POST) public void test(Principal principal) throws Exception { this.template.convertAndSendToUser(principal.getName(), "/queue/click", ""); }

Con esto, todos los usuarios se suscriben a cada canal y solo se notifica al usuario cuando se realiza una llamada de descanso.

La llamada de descanso debe autenticarse para que el Principal tenga el nombre de usuario.

El canal de usuario se administra automáticamente desde Spring, por lo que debe agregarlo de esta manera.

about 4 years ago · Santiago Trujillo Denunciar

0

Puede extender ChannelInterceptorAdapter y administrar cada evento individualmente:

 public class AuthorizedChannelInterceptorAdapter extends ChannelInterceptorAdapter { @Override public Message<?> preSend(Message<?> message, MessageChannel messageChannel) throws AuthenticationException { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); if (StompCommand.CONNECT == accessor.getCommand()) setUserAuthenticationToken(accessor); else if (StompCommand.SUBSCRIBE == accessor.getCommand()) validateSubscription((Authentication) accessor.getUser(), accessor.getDestination()); return message; } private void setUserAuthenticationToken(StompHeaderAccessor accessor) { String token = accessor.getFirstNativeHeader(HttpHeaders.AUTHORIZATION); accessor.setUser(loadAuthentication(token)); } private Authentication loadAuthentication(String token){ return ....; } private void validateSubscription(Authentication authentication, String destination) { if(...) throw new AccessDeniedException("No permission to subscribe to this topic"); } }

En primer lugar, deberá almacenar el objeto de autenticación proporcionado por el cliente en el evento de conexión. Después de esto, cada evento enviado por el cliente tendrá configurado este objeto de autenticación para que pueda usarlo para validar si está autorizado para suscribirse a un canal en particular.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda