web-dev-qa-db-fra.com

SecurityContextHolder.getContext (). GetAuthentication () retournant null

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?

16
Rajesh Wadhwa

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.

10
Rajesh Wadhwa

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.

2
Bahadir Tasdemir

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

http://docs.spring.io/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/core/userdetails/User.html

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);
0
RPaul