Ho un'applicazione web che imposta un contesto di sicurezza a molla attraverso un filtro a molla. I servizi sono protetti con annotazioni a molla in base ai ruoli degli utenti. Questo funziona.Come propagare il contesto di sicurezza primaverile a JMS?
Le attività asincrone vengono eseguite nei listener JMS (estensione javax.jms.MessageListener). La configurazione di questi ascoltatori è terminata con Spring.
I messaggi vengono inviati dall'applicazione Web, in questo momento l'utente viene autenticato. Ho bisogno della stessa autenticazione nel thread JMS (utente e ruoli) durante l'elaborazione dei messaggi.
Oggi questo viene fatto inserendo l'autenticazione molla nella JMS ObjectMessage:
SecurityContext context = SecurityContextHolder.getContext();
Authentication auth = context.getAuthentication();
... put the auth object in jms message object
Poi dentro l'ascoltatore JMS dell'oggetto autenticazione viene estratto ed inserito nel contesto:
SecurityContext context = new SecurityContextImpl();
context.setAuthentication(auth);
SecurityContextHolder.setContext(context);
questo funziona La maggior parte delle volte. Ma quando c'è un ritardo prima dell'elaborazione di un messaggio, il messaggio non verrà mai elaborato. Non sono ancora riuscito a determinare la causa della perdita di questi messaggi, ma non sono sicuro che il modo in cui propagiamo l'autenticazione sia buono, anche se funziona in custer quando il messaggio viene elaborato su un altro server.
È questo il modo giusto per propagare un'autenticazione a molla?
saluti, Mickaël
Non ho familiarità con Spring in questo contesto, ma mi sono imbattuto in questo problema prima. Un buon contesto di sicurezza avrà una scadenza oltre la quale non potrà più essere utilizzato. In generale, se il recapito di un messaggio è ritardato oltre la scadenza, il contesto di sicurezza sarà scaduto e il messaggio non verrà elaborato. Questo potrebbe essere il problema qui, nel qual caso aumentare il tempo di scadenza potrebbe risolverlo, o almeno renderlo meno comune. – Alasdair