2017-11-17 9 views
1

스프링 부트 보안을 사용하여 remember-me를 구현하고 내 테이블 persistent_logins (사용자 이름, 시리즈, 토큰, last_used)에 데이터를 저장하고 브라우저의 코키에서 찾을 수 있도록 노력했습니다.Remember-me가 작동하지 않음

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

    http.authorizeRequests().antMatchers("/sentEmail").permitAll(); 
    http.authorizeRequests().antMatchers("/contactUs").permitAll(); 
    http.authorizeRequests().antMatchers("/reset").permitAll(); 

    http.authorizeRequests().antMatchers(Constants.PATTERN1).permitAll(); 
    http.authorizeRequests().antMatchers(Constants.PATHPATTERN2).permitAll(); 
    http.authorizeRequests().antMatchers(Constants.PATHPATTERN3).permitAll().and().rememberMe().rememberMeServices(rememberMeServices());  
    http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage(Constants.URL_PATH).successHandler(this.authSuccess).failureHandler(this.authFailure).permitAll(); 
    http.authorizeRequests().anyRequest().authenticated().and().logout().logoutSuccessHandler(this.logoutSuccess).deleteCookies("JSESSIONID").invalidateHttpSession(false).permitAll(); 

    http.csrf().disable();} 
@Bean 
public BCrypt bCryptPasswordEncoder() { 
    return new BCrypt(); 
} 


@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder); 

} 

@Bean 
public AbstractRememberMeServices rememberMeServices() { 
    PersistentTokenBasedRememberMeServices rememberMeServices = 
     new PersistentTokenBasedRememberMeServices("AppKey",userDetailsService(),persistentTokenRepository()); 
    rememberMeServices.setParameter("rememberMe"); 
    rememberMeServices.setAlwaysRemember(true); 
    rememberMeServices.setCookieName("javasampleapproach-remember-me"); 
    rememberMeServices.setTokenValiditySeconds(24 * 60 * 60); 
    return rememberMeServices; 
} 



@Bean 
public PersistentTokenRepository persistentTokenRepository() { 
    JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); 
    tokenRepository.setDataSource(dataSource); 
    return tokenRepository;} 

이 :

이 내 SecurityConfigWeb.java입니다 : 내가 내 브라우저에서 JSESSIONID를 삭제하고 그것을 페이지에 로그인 할 수있는 브라우저 리디렉션을 새로 고침과 같은 페이지에 아직도 할 때 내 문제입니다 기억을위한 내 login.html은 다음과 같습니다.

<div class="checkboxDiv"> 
         <input type="checkbox" name="remember-me" value="true"> <label class="check" for="checkbox">Stay Logged In</label> 
        </div> 

도움이됩니다. 미리 감사드립니다

+0

당신은 단지 나를 위해 pattern3 사용할 수 기억하십시오. 귀하의 보안 설정 이상한 그냥 모든 전화를 1 체인에 ... –

+0

미안 해요 M.Deinum 당신이 내가이 일을해야 의미하지 않습니다 : http.authorizeRequests(). antMatchers (Constants.PATTERN1) .permitAll(). 그리고() .rememberMe(). rememberMeServices (rememberMeServices()); http.authorizeRequests(). antMatchers (Constants.PATHPATTERN2) .permitAll().(). rememberMe(). rememberMeServices (rememberMeServices()); http.authorizeRequests(). antMatchers (Constants.PATHPATTERN3) .permitAll().(). rememberMe(). rememberMeServices (rememberMeServices()); ??? –

+1

보안 설정을위한 체인이 하나도 없어 ... –

답변

2

문제는 유창한 API를 사용하는 대신 여러 가지 진술로 보안을 구성했다는 것입니다. 이 라인으로

http.authorizeRequests().antMatchers(Constants.PATHPATTERN3).permitAll().and().rememberMe().rememberMeServices(rememberMeServices()); 

당신 만 Constants.PATHPATTERN3의 '나를 remeber'기능을 활성화. 따라서 모든 엔드 포인트에 대해 나를 기억하게하려면 보안 구성이 이와 같아야합니다.

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

    http.authorizeRequests() 
    .antMatchers("/sentEmail", "/contactUs", "/reset", Constants.PATTERN1,Constants.PATHPATTERN2, Constants.PATHPATTERN3).permitAll() 
    .anyRequest().authenticated() 
    .and() 
     .logout() 
     .logoutSuccessHandler(this.logoutSuccess).permitAll() 
    .and() 
     .formLogin() 
     .loginPage(Constants.URL_PATH) 
     .successHandler(this.authSuccess) 
     .failureHandler(this.authFailure).permitAll() 
    .and() 
     .rememberMe() 
     .tokenRepository(persistentTokenRepository()) 
     .key("AppKey") 
     .alwaysRemember(true) 
     .rememberMeParameter("rememberMe") 
     .rememberMeCookieName("javasampleapproach-remember-me") 
     .tokenValiditySeconds(24 * 60 * 60) 
    .and() 
     csfr().disable();  
} 

@Bean 
public PersistentTokenRepository persistentTokenRepository() { 
    JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); 
    tokenRepository.setDataSource(dataSource); 
    return tokenRepository; 
} 

이렇게하면 모든 것을 한 번에 구성 할 수 있습니다.

+1

원래 문제가 무엇인지, 그리고 코드가 문제를 해결 한 이유에 대한 정보를 추가하면 답변의 질이 향상 될 수 있습니다. –

+0

@M. Deinum 응답 늦어서 미안하지만 그것은 여전히 ​​jsessionid를 검색 할 때와 동일합니다. 로그인 페이지가 생겼고 예외가 발생했습니다 : org.springframework.security.web.access.ExceptionTranslationFilter.handleSpringSecurityException : 173 - 액세스가 거부되었습니다 (예 : 사용자는 익명 임); 인증 엔트리 포인트로 리다이렉트 org.springframework.security.access.access.AccessDeniedException : Accès refuséorg.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter (RememberMeAuthenticationFilter.java:149) –

+0

그렇다면 당신은 나를 기억하지 못한다. ... remember me 매개 변수의 이름이 구성된 것과 일치하는지 확인하십시오. 또한 수동으로 서비스를 구성하는 대신 네임 스페이스를 사용하는 것이 좋습니다. –