Je suis vraiment nouveau à Spring and Spring Security. Je lisais sur Spring Security et il est sorti le concept de principal , qui devrait être l'utilisateur actuellement connecté. Mais que faire si nous avons plus d'un utilisateur connecté actuel? Alors, ma question est, quel est alors exactement le principal de la sécurité au printemps?
J'ai lu par exemple ce tutoriel:
http://www.mkyong.com/spring-security/get-current-logged-in-username-in-spring-security/
et ils semblent tenir compte du fait qu'il n'y a qu'un seul utilisateur connecté, ce qui n'est pas souvent le cas.
Comment récupérer un utilisateur spécifique? Et comment différencier les utilisateurs qui font des demandes?
Le principal est l'utilisateur actuellement connecté. Cependant, vous le récupérez via le contexte de sécurité qui est lié au thread actuel et en tant que tel, il est également lié à la demande en cours et à sa session.
SecurityContextHolder.getContext()
obtient en interne l'implémentation actuelle de SecurityContext
via une variable ThreadLocal
. Parce qu'une demande est liée à un seul thread, cela vous donnera le contexte de la demande actuelle.
Pour simplifier, vous pouvez dire que le contexte de sécurité est dans la session et contient l'utilisateur/principal et les rôles/autorités.
Comment récupérer un utilisateur spécifique?
Non. Toutes les API sont conçues pour permettre l'accès à l'utilisateur et à la session de la demande actuelle. Soit l'utilisateur A l'un des 100 utilisateurs actuellement authentifiés. Si A émet une demande contre votre serveur, il allouera un thread pour traiter cette demande. Si vous faites alors SecurityContextHolder.getContext().getAuthentication()
vous le faites dans le contexte de ce fil. Par défaut, à partir de ce thread, vous n'avez pas accès au contexte de l'utilisateur B qui est traité par un autre thread.
Et comment différencier les utilisateurs qui font des demandes?
Vous n'êtes pas obligé, c'est ce que le conteneur Servlet fait pour vous.