복붙노트

[SPRING] 프로그래밍 방식으로 로그인 할 때 생성 된 쿠키를 기억하십시오

SPRING

프로그래밍 방식으로 로그인 할 때 생성 된 쿠키를 기억하십시오

등록 직후 (등록) 스프링 보안을 통해 프로그래밍 방식으로 사용자에 로그인하고 있습니다.

public register(HttpServletRequest request, String user, String password) {
    ...
    request.login(user, password);
}

이것은 정상적으로 작동하지만 remember-me 쿠키는 생성하지 않습니다 (대화식 로그인을 사용하면 쿠키가 잘 작성됩니다). 이제이 답변과이 답변을 읽어 보았습니다. RememberMeServices (PersistentTokenBasedRememberMeServices를 사용) 구현을 연결 한 다음 onLoginSuccess를 호출해야합니다. PersistentTokenBasedRememberMeServices를 autowire하는 데 성공하지 못했습니다. 이 작품을 만드는 방법? 이것이 올바른 방법일까요? Spring Security가 더 편리한 방법을 제공하지 않는 이유는 무엇입니까?

P.S .: 이것은 내 구성에서 발췌 한 것입니다.

@Configuration
@EnableWebSecurity
public class WebSecConf extends WebSecurityConfigurerAdapter {

    ...

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .rememberMe()
                .tokenRepository(new MyPersistentTokenRepository())
                .rememberMeCookieName("rememberme")
                .tokenValiditySeconds(60 * 60 * 24) 
                .alwaysRemember(true)
                .useSecureCookie(true)
                .and()
            ....
       ...
    }
}

해결법

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

    1.Spring 버전은 언급하지 않았습니다. 아래의 설정은 Spring 4에서 작동하지만 다른 버전에서도 수정할 수 있습니다. WebSecConf 클래스에서 PersistentTokenRepository 및 UserDetailsService 인터페이스를 자동으로 호출합니다. Bean을 추가하여 PersistentTokenBasedRememberMeServices 인스턴스를 가져옵니다.

    Spring 버전은 언급하지 않았습니다. 아래의 설정은 Spring 4에서 작동하지만 다른 버전에서도 수정할 수 있습니다. WebSecConf 클래스에서 PersistentTokenRepository 및 UserDetailsService 인터페이스를 자동으로 호출합니다. Bean을 추가하여 PersistentTokenBasedRememberMeServices 인스턴스를 가져옵니다.

    @Configuration
    @EnableWebSecurity
    public class WebSecConf extends WebSecurityConfigurerAdapter {
    
    @Autowired
    PersistentTokenRepository persistenceTokenRepository;
    @Autowired
    UserDetailsService userDetailsService;
        ...
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
    
            http
                .rememberMe()
                    .tokenRepository(persistenceTokenRepository)
                    .rememberMeCookieName("rememberme")
                    .tokenValiditySeconds(60 * 60 * 24) 
                    .alwaysRemember(true)
                    .useSecureCookie(true)
                    .and()
                ....
           ...
        }
    
    @Bean
    public PersistentTokenBasedRememberMeServices getPersistentTokenBasedRememberMeServices() {
        PersistentTokenBasedRememberMeServices persistenceTokenBasedservice = new PersistentTokenBasedRememberMeServices("rememberme", userDetailsService, persistenceTokenRepository);
        persistenceTokenBasedservice.setAlwaysRemember(true);
        return persistenceTokenBasedservice;
      }
    }
    

    이제 프로그래밍 방식의 로그인을하는 컨트롤러 또는 클래스에서 PersistentTokenBasedRememberMeServices를 autowire하고 loginSuccess 메소드를 호출하는 메소드 내에 아래 코드를 추가하십시오.

    @Autowired
    PersistentTokenBasedRememberMeServices persistentTokenBasedRememberMeServices;
    
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null){
            persistentTokenBasedRememberMeServices.loginSuccess(request, response, auth);
        }
    
  2. from https://stackoverflow.com/questions/41241387/no-spring-security-remember-me-cookie-created-when-logging-in-programmatically by cc-by-sa and MIT license