Je souhaite contourner manuellement l'utilisateur de Spring Security à l'aide du code suivant:
User localeUser = new User();
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(localeUser ,null, localeUser .getAuthorities());
SecurityContext securityContext = SecurityContextHolder.getContext();
securityContext.setAuthentication(auth);
// Create a new session and add the security context.
HttpSession session = request.getSession(true);
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
return "dummyLogin";
La page de connexion factice (gérée par des tuiles) appelle en interne un mappage de demande différent dans le même contrôleur où j'essaie d'obtenir quelque chose d'authentification comme ceci.
SecurityContextHolder.getContext().getAuthentication()
Où suis-je devenu nul?
J'ai donc trouvé le vrai problème!. Le problème était que j'avais marqué le contrôleur entier avec security = "none" dans le security-context.xml. Donc, quand il a été renvoyé du premier lien au deuxième, il ne passait aucun contexte de sécurité avec lui !! Désolé les ennuis.
Réponse supplémentaire: Si vous souhaitez obtenir les détails de l'utilisateur connecté pour une URL non sécurisée, vous pouvez les ajouter aux URL sécurisées et les affecter en tant que "permitAll" comme ceci:
<http>
//...
<intercept-url pattern="/your/url/**" access="permitAll"/>
//...
</http>
Ensuite, vous pourrez vérifier l'utilisateur connecté s'il est connecté ou obtenir les informations d'identification.
Votre utilisateur local est nul. Ainsi, l'authentification devient nulle. Aucun objet d'authentification n'a donc été ajouté au contexte de sécurité.
Veuillez regarder le doc
Il est préférable d'avoir un serviceUserDetailsService personnalisé
public class CustomUserDetailsService implements UserDetailsService
//implement the method which return a UserDetails Object
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
alors vous pouvez utiliser
UserDetails userDetails= customUserDetailsService.loadUserByUsername("name");
Authentication authentication= new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()) ;
SecurityContextHolder.getContext().setAuthentication(authentication);