복붙노트

[SPRING] Spring 3.1에서 remember-me 기능으로 사용자 로그인하기

SPRING

Spring 3.1에서 remember-me 기능으로 사용자 로그인하기

현재 로그인 방식을 사용하는 것보다 Facebook이나 다른 방법을 통해 로그인 할 때 프로그래밍 방식으로 사용자를 기록합니다.

SecurityContextHolder.getContext().setAuthentication(
  new UsernamePasswordAuthenticationToken(user, "", authorities)
);

대신 로그인 양식에 remember-me 옵션을 설정 한 것처럼 사용자를 로그인하십시오. 그래서 UsernamePasswordAuthenticationToken 대신에 RememberMeAuthenticationToken을 사용해야한다고 생각하니? 그러나 생성자의 핵심 인수에 대해 무엇을 넣어야합니까?

RememberMeAuthenticationToken(String key, Object principal, Collection<? extends GrantedAuthority> authorities) 

업데이트 : 여기에 설명 된 Persistent Token Approach를 사용하고 있습니다. 따라서 Simple Hash-Based Token Approach와 같은 키는 없습니다.

해결법

  1. ==============================

    1.나는 당신이 이미 당신의 설정에서 를 설정했다고 가정한다.

    나는 당신이 이미 당신의 설정에서 를 설정했다고 가정한다.

    remember-me 작동 방식은 세션이 만료 된 후 사용자가 사이트로 돌아올 때 인식되는 쿠키를 설정하는 것입니다.

    사용중인 RememberMeServices (TokenBased 또는 PersistentTokenBased)를 서브 클래스 화하고 onLoginSuccess ()를 public으로 만들어야합니다. 예 :

    public class MyTokenBasedRememberMeServices extends PersistentTokenBasedRememberMeServices {
        @Override
        public void onLoginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) {
            super.onLoginSuccess(request, response, successfulAuthentication);
        }   
    } 
    
    <remember-me services-ref="rememberMeServices"/>
    
    <bean id="rememberMeServices" class="foo.MyTokenBasedRememberMeServices">
        <property name="userDetailsService" ref="myUserDetailsService"/>
        <!-- etc -->
    </bean>
    

    프로그래밍 방식의 로그인을 수행중인 Bean에 RememberMeServices를 주입하십시오. 그런 다음 생성 한 UsernamePasswordAuthenticationToken을 사용하여 onLoginSuccess ()를 호출하십시오. 그러면 쿠키가 설정됩니다.

    UsernamePasswordAuthenticationToken auth = 
        new UsernamePasswordAuthenticationToken(user, "", authorities);
    SecurityContextHolder.getContext().setAuthentication(auth);
    getRememberMeServices().onLoginSuccess(request, response, auth);  
    

    최신 정보

    @at는 RememberMeServices의 하위 클래스 화없이이 점을 개선했습니다.

    UsernamePasswordAuthenticationToken auth = 
        new UsernamePasswordAuthenticationToken(user, "", authorities);
    SecurityContextHolder.getContext().setAuthentication(auth);
    
    // This wrapper is important, it causes the RememberMeService to see
    // "true" for the "_spring_security_remember_me" parameter.
    HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(request) {
        @Override public String getParameter(String name) { return "true"; }            
    };
    
    getRememberMeServices().loginSuccess(wrapper, response, auth);  
    
  2. ==============================

    2.이것은 생성자의 소스입니다.

    이것은 생성자의 소스입니다.

    public RememberMeAuthenticationToken(String key, Object principal, Collection<? extends GrantedAuthority> authorities) {
        super(authorities);
    
        if ((key == null) || ("".equals(key)) || (principal == null) || "".equals(principal)) {
            throw new IllegalArgumentException("Cannot pass null or empty values to constructor");
        }
    
        this.keyHash = key.hashCode();
        this.principal = principal;
        setAuthenticated(true);
    }
    

    키는 해시되어 보안 컨텍스트에서이 사용자에 대해 사용 된 인증이 위조 된 것인지 여부를 판별하는 데 사용됩니다.

    RememberMeAuthenicationProvider 소스를 살펴보십시오.

    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        if (!supports(authentication.getClass())) {
            return null;
        }
    
        if (this.key.hashCode() != ((RememberMeAuthenticationToken) authentication).getKeyHash()) {
            throw new BadCredentialsException(messages.getMessage("RememberMeAuthenticationProvider.incorrectKey",
                    "The presented RememberMeAuthenticationToken does not contain the expected key"));
        }
    
        return authentication;
    }
    

    그래서 귀하의 질문에 대답하기 위해, 당신은 사용자를 나타내는 인증의 키 필드의 해시 코드를 전달해야합니다.

  3. from https://stackoverflow.com/questions/7806921/log-user-in-with-remember-me-functionality-in-spring-3-1 by cc-by-sa and MIT license