Mon application utilise la sécurité de printemps et mon client nécessite: P>
Donc, j'ai besoin de déterminer comment vous connecter en tant qu'utilisateur automatiquement sans connaître leur mot de passe. p>
Comment cela peut-il être accompli à l'aide de la sécurité du ressort? p>
3 Réponses :
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;
}
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). i>
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 ()); Code>
C'est la réponse à la question ci-dessus
dans le contrôleur: strong> 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");
}