2011-07-05 4 views
5

스프링 보안을 사용하는 응용 프로그램이 있습니다. 가입 프로세스에서 새 사용자 엔티티가 해시 된 비밀번호로 유지되고 활성화 토큰을 포함하는 이메일이 사용자에게 전송됩니다. 이 토큰을 클릭하면 사용자가 토큰별로 사용자를 조회하고 사용자를 활성화 한 다음 응용 프로그램으로 리디렉션하는 UserActivationServlet으로 이동합니다. 나는 자동으로 응용 프로그램에 사용자가 로그 싶습니다 여기이스프링 보안이있는 자동 로그인

private void authenticateUserAndSetSession(HttpServletRequest request, User u) { 
    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
      u.getUsername(), u.getPassword()); //PROBLEM: THIS PASSWORD IS HASHED 

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

    token.setDetails(new WebAuthenticationDetails(request)); 
    Authentication authenticatedUser = authenticationManager.authenticate(token); 

    SecurityContextHolder.getContext().setAuthentication(authenticatedUser); 
    request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, 
      SecurityContextHolder.getContext()); 
} 

문제를 어떻게 내 서블릿에서이 방법이 작성 될 때 사용자 개체의 암호 필드가 해시되었다는 점이다를 포함했다. 그래서 내가 생각할 수있는 유일한 다른 옵션은 서블릿에 요청 매개 변수로 unhashed 암호를 전달하는 것입니다. (불쾌합니다.)

내가 놓친 것이 있습니까? 사용자를 사전 인증하는 다른 방법이 있습니까?

감사 SOA 당신을 도울 수 내가 제대로 이해하면

+1

, 사용자가 활성화 링크를 클릭하고 우리는 보았다 : 다음과 같이 그냥 만드는, 그래서 authenticationManager와 함께 토큰을 생성 할 때 자격 증명을 사용할 필요 그를 다시 인증하지 그 사람이 분명히 우리에게는 유효한 사용자가 있으므로 아무 것도 없습니다. authenticationManager로 다시 인증해야하고 토큰을 만들 때 자격 증명을 사용할 필요가 없으므로 다음과 같이 작성하면됩니다. PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken ( p, null, p.getAuthorities()); –

+0

또 다른 비슷한 질문 (및 대답)은 여기에서 찾을 수 있습니다. http://stackoverflow.com/a/12057327/26510 –

+1

@ClintonBosch 의견을 답으로 쓰고 받아 들일 수 있습니다. – fglez

답변

3

사용자는 활성화 링크를 클릭하고 우리는 우리가 유효한 사용자가 너무 명확하게 그를 보았다, 그래서 필요가 없습니다 내가 여기 바보했다

PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken(p, null, p.getAuthorities()); 
0

.

로그인 페이지로 리디렉션하지 않고 사용자를 로그인하는 서비스를 호출하십시오. 컨트롤러 (또는 서비스 계층 위의 어딘가)에있는 모든 로그인 관련 로직은 아래로 이동해야합니다 '귀하의 서블릿에 의해 사용됩니다. 그런 다음 당신이 당신의 서블릿에서 loginService.login(username);를 호출 할 수 있습니다

public interface LoginService { 
    // this will be called from the login page 
    public void login(String username, String hashedPass); 

    // this will only be visible to other services 
    // you can secure it with AOP and Spring security's method security 
    public void login(String username); 
} 

:

이 서비스는 같은 것을 볼 수 있었다.

또는 정확한 경우

은 암호없이 토큰을 전달 :

loginService.login(new UsernamePasswordAuthenticationToken(u.getUsername(), "")); 
+0

왜 부정적인 점수입니까? – Simeon