71 votes

Connexion par programme à un utilisateur à l'aide de Spring Security

À l'opposé de cela.

Dans mon application j'ai enregistrer un nouvel utilisateur de l'écran, qui affiche à un contrôleur qui crée un nouvel utilisateur au sein db (et fait quelques vérifications).Je veux ce nouvel utilisateur d'être connecté automatiquement ... je veux somethign comme ceci :

SecurityContextHolder.getContext().setPrincipal(MyNewUser);

Modifier Eh bien, j'ai presque mis en œuvre en fonction de la réponse ici :

 Authentication auth = new UsernamePasswordAuthenticationToken(MyNewUser, null);
 SecurityContextHolder.getContext().setPrincipal(MyNewUser);

Toutefois, lorsqu'il est déployé à la jsp ne peux pas accéder à mon MyNewUser.getWhateverMethods() alors qu'il n'lors de la procédure de connexion normale suivie. le code qui fonctionne nomrally, mais renvoie une erreur lors de la connexion, comme ci-dessus est ci-dessous :

<sec:authentication property="principal.firstname" /> 

51voto

NimChimpsky Points 20263

Dans mon contrôleur, j'ai ceci, qui connecte l'utilisateur comme d'habitude :

 Authentication auth = 
  new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());

SecurityContextHolder.getContext().setAuthentication(auth);
 

Où utilisateur est mon objet utilisateur personnalisé (implémentation de UserDetails) qui vient d'être créé. La méthode getAuthorities fait ceci (simplement parce que tous mes utilisateurs ont le même rôle):

 public Collection<GrantedAuthority> getAuthorities() {
        //make everyone ROLE_USER
        Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
        GrantedAuthority grantedAuthority = new GrantedAuthority() {
            //anonymous inner type
            public String getAuthority() {
                return "ROLE_USER";
            }
        }; 
        grantedAuthorities.add(grantedAuthority);
        return grantedAuthorities;
    }
 

33voto

acohen Points 179

Vous pouvez également injecter votre sécurité de ressort configurée UserDetailsManager à votre contrôleur et l'utiliser pour obtenir le UserDetails qui contient le principal et les autorités pour éviter le code en double:

 // inject

@Autowired
private UserDetailsManager manager; 

// use in your method

UserDetails userDetails = manager.loadUserByUsername (token.getUsername ());
Authentication auth = new UsernamePasswordAuthenticationToken (userDetails.getUsername (),userDetails.getPassword (),userDetails.getAuthorities ());
SecurityContextHolder.getContext().setAuthentication(auth);
 

11voto

Simeon Points 3511

Source de sécurité printanière AbstractAuthenticationProcessingFilter :

 protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,
        Authentication authResult) throws IOException, ServletException {

    if (logger.isDebugEnabled()) {
        logger.debug("Authentication success. Updating SecurityContextHolder to contain: " + authResult);
    }

    // you need this
    SecurityContextHolder.getContext().setAuthentication(authResult);

    rememberMeServices.loginSuccess(request, response, authResult);

    if (this.eventPublisher != null) {
        eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));
    }

    successHandler.onAuthenticationSuccess(request, response, authResult);
}
 

Notez cependant que les SecurityContextHolder sont généralement effacés à la fin de la chaîne de filtrage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X