2015-01-27 3 views
0

스프링 보안 및 영구 기억 기능으로 스프링 애플리케이션을 성공적으로 구성했습니다. 그러나 다음 단계를 수행하면 Safari 7.1.2에서 오류가 발생합니다.Safari에서 스프링 보안 기억 기능이 작동하지 않음

  1. 나를 기억하십시오 (데이터베이스에 토큰 생성이 확인 됨).
  2. 브라우저에서 JSESSIONID 쿠키를 수동으로 삭제하여 세션 만료를 시뮬레이트합니다.
  3. 브라우저 새로 고침.

결과 오류는 다음과 같습니다

org.springframework.security.web.authentication.rememberme.CookieTheftException : 잘못된 기억 - 나 토큰 (시리즈/토큰) 불일치. 이전의 쿠키 도용 공격을 암시합니다.

FireFox 31.3.0에서 이와 똑같은 단계를 수행하면 예상대로 사용자가 다시 로그인됩니다.

다음
@Configuration 
@EnableWebMvcSecurity 
@ComponentScan(basePackages={"com.example.app.config"}) 
public class SecurityConfig extends WebSecurityConfigurerAdapter{ 

@Autowired 
private DataSource dataSource; 

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 

    auth.jdbcAuthentication() 
     .dataSource(dataSource); 

} 

@Override 
public void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
     .antMatchers("/new").access("hasRole('USER')") 
     .antMatchers("/call/**").access("hasRole('USER')") 
     .antMatchers("/contacts/**").access("hasRole('USER')") 
     .antMatchers("/").access("hasRole('USER')") 
     .antMatchers("/resources/css/**").permitAll() 
     .antMatchers("/resources/js/**").permitAll() 
     .and() 
      .formLogin() 
      .loginPage("/signin") 
      .loginProcessingUrl("/j_spring_security_check") 
      .usernameParameter("username") 
      .passwordParameter("password") 
      .permitAll(); 

    http.rememberMe() 
     .key("notasecret") 
     .rememberMeServices(rememberMeServices()) 
     .userDetailsService(userDetailsService()); 
} 

@Bean 
public JdbcDaoImpl userDetailsService() { 
    JdbcDaoImpl userDetailsService = new JdbcDaoImpl(); 
    userDetailsService.setDataSource(dataSource); 
    return userDetailsService; 
} 

@Bean 
public PersistentTokenBasedRememberMeServices rememberMeServices() { 
    PersistentTokenBasedRememberMeServices services = new PersistentTokenBasedRememberMeServices("notasecret", userDetailsService(), tokenRepository()); 
    services.setTokenValiditySeconds(43200); 
    return services; 
} 

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

은 사파리에 대한 디버그 추적에 무슨 :

DEBUG: org.springframework.security.web.FilterChainProxy -/at position 1 of 13 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter' 
DEBUG: org.springframework.security.web.FilterChainProxy -/at position 2 of 13 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter' 
DEBUG: org.springframework.security.web.context.HttpSessionSecurityContextRepository - No HttpSession currently exists 
DEBUG: org.springframework.security.web.context.HttpSessionSecurityContextRepository - No SecurityContext was available from the HttpSession: null. A new one will be created. 
DEBUG: org.springframework.security.web.FilterChainProxy -/at position 3 of 13 in additional filter chain; firing Filter: 'HeaderWriterFilter' 
DEBUG: org.springframework.security.web.header.writers.HstsHeaderWriter - Not injecting HSTS header since it did not match the requestMatcher org.springframework.se[email protected]69d3d174 
DEBUG: org.springframework.security.web.FilterChainProxy -/at position 4 of 13 in additional filter chain; firing Filter: 'CsrfFilter' 
DEBUG: org.springframework.security.web.FilterChainProxy -/at position 5 of 13 in additional filter chain; firing Filter: 'LogoutFilter' 
DEBUG: org.springframework.security.web.util.matcher.AntPathRequestMatcher - Request 'GET /' doesn't match 'POST /logout 
DEBUG: org.springframework.security.web.FilterChainProxy -/at position 6 of 13 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter' 
DEBUG: org.springframework.security.web.util.matcher.AntPathRequestMatcher - Request 'GET /' doesn't match 'POST /j_spring_security_check 
DEBUG: org.springframework.security.web.FilterChainProxy -/at position 7 of 13 in additional filter chain; firing Filter: 'RequestCacheAwareFilter' 
DEBUG: org.springframework.security.web.FilterChainProxy -/at position 8 of 13 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter' 
DEBUG: org.springframework.security.web.FilterChainProxy -/at position 9 of 13 in additional filter chain; firing Filter: 'RememberMeAuthenticationFilter' 
DEBUG: org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices - Remember-me cookie detected 
DEBUG: org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices - Cancelling cookie 
DEBUG: org.springframework.security.web.context.HttpSessionSecurityContextRepository - SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession. 
DEBUG: org.springframework.security.web.context.SecurityContextPersistenceFilter - SecurityContextHolder now cleared, as request processing completed 
Jan 27, 2015 11:54:17 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/ocl] threw exception 
org.springframework.security.web.authentication.rememberme.CookieTheftException: Invalid remember-me token (Series/token) mismatch. Implies previous cookie theft attack. 

내 이론이 로그의 포인트가 없다는 것을 다음

응용 프로그램 보안에 대한 Java 설정입니다 "쿠키 취소 중"이 문제입니다. 그러나, 나는 이것이 왜 일어나고 있는지 모른다.

누군가가이 문제에 부딪혔거나 위의 구성에서 잘못되었거나 누락 된 부분이 있으면 알려주십시오.

답변

0

나는 다른 모든 복잡성을 제거하기 위해 베어 본 보안 전용 응용 프로그램에서 시작하여 기억 기능을 작동시킬 수있었습니다. 나는 내 테스트 응용 프로그램과 기본 응용 프로그램 사이의 각각의 pom.xml 파일에서 피크를 가져다가 작동하지 않는 나를 기억 응용 프로그램에서 다음과 같은 의존성을 제거 :

<dependency> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-web</artifactId> 
    <version>3.2.5.RELEASE</version> 
</dependency> 

이것은 spring-security-core 때문에 모든 충돌되어 있어야합니다 의존성을 제거한 후 잘 작동했습니다.

관련 문제