[SPRING] Spring 3.1에서 remember-me 기능으로 사용자 로그인하기
SPRINGSpring 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.나는 당신이 이미 당신의 설정에서
를 설정했다고 가정한다. 나는 당신이 이미 당신의 설정에서
를 설정했다고 가정한다. 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.이것은 생성자의 소스입니다.
이것은 생성자의 소스입니다.
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; }
그래서 귀하의 질문에 대답하기 위해, 당신은 사용자를 나타내는 인증의 키 필드의 해시 코드를 전달해야합니다.
from https://stackoverflow.com/questions/7806921/log-user-in-with-remember-me-functionality-in-spring-3-1 by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Flex 4 마이그레이션 경험이 있습니까? (0) | 2019.01.28 |
---|---|
[SPRING] Spring 3.0과 Jackson이있는 JSONP (0) | 2019.01.28 |
[SPRING] 세션 지원을 사용하는 Spring mvc 3.1 통합 테스트 (0) | 2019.01.28 |
[SPRING] web.xml과 같이 spring-boot 서블릿을 설정하는 방법은? (0) | 2019.01.28 |
[SPRING] Spring 보안 OAuth2 자원 서버 항상 잘못된 토큰 반환 (0) | 2019.01.28 |