7
votes

Comment se connecter automatiquement en tant qu'utilisateur utilisant la sécurité de printemps sans connaître leur mot de passe?

Mon application utilise la sécurité de printemps et mon client nécessite:

  • Les utilisateurs doivent pouvoir vous connecter automatiquement après l'inscription.
  • un administrateur pour vous connecter en tant qu'utilisateur sans connaître leur mot de passe.

    Donc, j'ai besoin de déterminer comment vous connecter en tant qu'utilisateur automatiquement sans connaître leur mot de passe.

    Comment cela peut-il être accompli à l'aide de la sécurité du ressort?


0 commentaires

3 Réponses :


7
votes

Pour que cela fonctionne, je devais:

Configurez une référence à l'utilisateurDétailsService (JDBCUSERSERVICE) P>

@RequestMapping("/automatic/login/test")
public @ResponseBody String automaticLoginTest(HttpServletRequest request) 
{
    String username = "anyUserName@YourSite.com";

    Boolean result = authenticateUserAndInitializeSessionByUsername(username, userDetailsManager, request);

    return result.toString();
}

public boolean authenticateUserAndInitializeSessionByUsername(String username, UserDetailsManager userDetailsManager, HttpServletRequest request)
{
    boolean result = true;

    try
    {
        // generate session if one doesn't exist
        request.getSession();

        // Authenticate the user
        UserDetails user = userDetailsManager.loadUserByUsername(username);
        Authentication auth = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(auth);
    }
    catch (Exception e)
    {
      System.out.println(e.getMessage());

      result = false;
    }

    return result;
}


3 commentaires

Le Javadoc sur UserNamePasswordAuthentiollingToken a déclaré: Ce constructeur ne doit être utilisé que par l'authentificationManager ou l'authentificationProvider implémentations satisfaits de la production d'un jeton d'authentification de confiance (i.e. isauthentiqué () = vrai).


Ce fut la seule façon dont j'ai trouvé «se connecter en tant qu'utilisateur sans connaître leur mot de passe» pour travailler ... Je ne travaille plus sur ce projet, mais pensez que les docs pourraient être lus comme «Ce constructeur ne devrait être que Utilisé par le code qui est satisfait de la production d'un jeton authentifiant de confiance (c'est-à-dire iSAuthentiqué () = vrai) ... Si vous trouvez une meilleure façon, postez-le définitivement ici!


Dans mon application Spring Security intégrée ExtJS, cela ne fonctionne que pour moi après avoir remplacé la clé de contexte de sécurité de printemps existante de la session avec le contexte de sécurité nouvellement authentifié. demande.getsession (). setattribute (httpsessSeSeSecuritTextexitexitexitent.spring_se curity_context_key, SecurityContexTholder.getContext ());



1
votes

pour le deuxième problème

Un administrateur pour vous connecter en tant qu'utilisateur sans connaître leur mot de passe.

Vous devez utiliser la fonction utilisateur du commutateur à partir du ressort. Javadoc et Article


0 commentaires

1
votes

C'est la réponse à la question ci-dessus dans le contrôleur: strong> xxx pré>

Au-dessus de la méthode au-dessus du contrôleur est défini comme suit: strong> p>

`private void authenticateUserAndSetSession(Users user, String passwor`dFromForm, HttpServletRequest request){

        String username = user.getUsername();
        System.out.println("username:  " + username + " password: " + passwordFromForm);                        

        UserDetails userDetails = userDetailsService.loadUserByUsername(user.getUsername());

        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(username, passwordFromForm, userDetails.getAuthorities());
        request.getSession();

        System.out.println("Line Authentication 1");

        usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetails(request));

        System.out.println("Line Authentication 2");

        Authentication authenticatedUser = authenticationManager.authenticate(usernamePasswordAuthenticationToken);

        System.out.println("Line Authentication 3");


        if (usernamePasswordAuthenticationToken.isAuthenticated()) {
            SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
            System.out.println("Line Authentication 4");

        }

     request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());// creates context for that session.

        System.out.println("Line Authentication 5");

        session.setAttribute("username", user.getUsername());

        System.out.println("Line Authentication 6");

        session.setAttribute("authorities", usernamePasswordAuthenticationToken.getAuthorities());

        System.out.println("username:  " + user.getUsername() + "password: " + user.getPassword()+"authorities: "+ usernamePasswordAuthenticationToken.getAuthorities());

        user = userDAO.validate(user.getUsername(), user.getPassword());
        log.debug("You are successfully register");

    }


0 commentaires