Printemps de Sécurité et @Async (Utilisateurs Authentifiés mélangé)
Je asynchrone appeler la méthode avec le Printemps, à l'aide de @Asynchrone.Cette méthode appelle d'autres méthode annotée avec @exiger une autorisation préalable, le Printemps de Sécurité de l'Annotation. Pour faire d'autorisation de travaux, je dois mettre en SecurityContextHolder
mode de MODE_INHERITABLETHREADLOCAL
, afin que l'authentification de l'info est passée à l'appel asynchrone. Tout fonctionne bien jusqu'à présent.
Cependant, quand je vous déconnecter et vous connecter en tant qu'utilisateur différent, dans la méthode asynchrone SecurityContextHolder magasins d'authentification info de l'ancien utilisateur, qui a été déconnecté. Il provoque des cours indésirables AccessDenied
exception. Il n'y a pas ce problème avec des appels synchrones.
J'ai défini <task:executor id="executors" pool-size="10"/>
, de sorte qu'il peut être un problème qu'une fois le fil dans la exécuteurs de la piscine a été initialisé, il ne sera pas remplacer l'authentification de l'information?
Vous devez vous connecter pour publier un commentaire.
Je suppose que
MODE_INHERITABLETHREADLOCAL
ne fonctionne pas correctement avec le pool de thread.Comme une solution possible, vous pouvez essayer à la sous-classe
ThreadPoolTaskExecutor
et de redéfinir ses méthodes pour propagerSecurityContext
manuellement, et ensuite déclarer que l'exécuteur testamentaire au lieu de<task:executor>
, quelque chose comme ceci:execute(Callable c)
(il est mieux de s'étendre " m en tout)org.springframework.security.concurrent.DelegatingSecurityContextExecutorService
C'est juste une indication que les besoins futurs de l'enquête (je suis trop fatigué, mais peut-être que quelqu'un à trouver cela utile pour les recherches à venir):
Aujourd'hui, je suis tombé sur
org.springframework.de sécurité.de la tâche.DelegatingSecurityContextAsyncTaskexecutor
voir GitHub.on dirait que son conçu pour déléguer le contexte de sécurité de sorte qu'il est "adopté" par le biais de la
@Async
appel.Aussi avoir un oeil sur ce post: Printemps de Sécurité 3.2 M1 faits Saillants, Servlet 3 prise en charge des API est des sons, comme il est fortement lié.
DelegatingSecurityContextAsyncTaskExecutor
mais parce que le reste d'une utilisation antérieure où ils ne sont pas supprimés par la suite.En utilisant les informations de Ralph et de Chêne -
Si vous souhaitez obtenir @Asynchrone de travail avec la norme exécuteur de tâches balise, vous devez définir votre source XML de config comme ceci
Puis dans votre @méthode Asynchrone, vous devez spécifier la piscine que vous souhaitez utiliser
Qui devrait fonctionner ainsi, lorsque chaque fois que vous appelez votre @méthode Asynchrone, le pool de threads thread va utiliser le même contexte de sécurité que le thread appelant
Basé sur @Ralph réponse on peut atteindre
Aync event
avecSpring
avecthreadpooling
et délégué à la sécurité à l'aide http://docs.spring.io/autorepo/docs/spring-security/4.0.0.M1/apidocs/org/springframework/security/task/DelegatingSecurityContextAsyncTaskExecutor.htmlExemple de code
Jus à ajouter à la réponse de @axtavt, vous aussi, vous voulez remplacer une autre méthode.