2017-11-22 29 views
0

remember-me 쿠키를 복구 한 후 만료되면 사용자 세션이 올바르게 작동하지 않습니다.세션이 만료 된 후 remember-me 토큰으로 아파치 프록시가 세션을 올바르게 복구하지 않음

스프링 보안에서 remember-me 옵션을 사용할 때 특별한 오류가 있습니다. 세션이 만료되면 나머지 웹 페이지는 탐색 할 수 있지만 로그 아웃은 다른 POST 메서드는 서버에서 오류를 생성합니다. 내 컨트롤러는 POST 대신 GET 메서드를 사용하기 때문에 작동하지 않습니다. 이유는 모르겠다.

먼저 아파치 웹 서버가 프록시로 작동하며 ProxyPass 구성으로 작동합니다. 나는 응용 프로그램의 이름을 표시하지 않고 내 도메인 www.example.com에 액세스하려는 때문에 (다른 사람의 말에, 나는 나타냅니다 www.example.com/appName을 싶지 않는) 로 ROOT.war을 내 .WAR을 배치

나는이 사건에 대해 많은 문서를 읽을 수 있으며, virtal 호스트 내 구성은 다음 줄이 있습니다 : 봄 Scurity 지침에 대한

ProxyRequests Off 
<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

ProxyPass/http://example.com:9080/ 
ProxyPassReverse/http://example.com:9080/ 

<Location /> 
    Order allow,deny 
    Allow from all 
</Location> 

#FIX For Spring Security 
RewriteEngine on 
RewriteRule ^/(.*)$ http://example.com:9080/$1 [P,L] 

수정 정상적인 인증이 양식을 사용 후 포스트 방법에 대한이 켜지지 있습니다.

JSSESIONID 쿠키가 만료되기 전에

문제는 내가 제대로 응용 프로그램을 사용할 수 있습니다 : 내가 로그 아웃 할 수 있습니다, 여기 ... 아무런 문제 등 다른 방법 게시물을 사용할 수 있습니다. 그러나 세션이 만료되면 아무것도 넘겨집니다.. 나는 웹 페이지를 통해 정보에 접근 할 수 있으며 인증을 위해 로그인 페이지로 리다이렉트하지 않는다. (나는 remember-me cockie가 작동한다는 것을 알고있다.)하지만 POST 메소드를 사용하면 문제가 생긴다. 나의 컨트롤러는 거절한다. 요청은 GET 메서드를 사용하기 때문에 발생합니다.

동일한 환경에서 앱을 테스트했지만 security-context.xml에서 remember-me 설정을 사용 중지하고 ROOT.war을 배포하고 세션이 만료되면 앱을 테스트하는 등 ..... 리디렉션 중입니다. 로그인 페이지가 올바르게 표시됩니다.

로컬 tomcat (아파치 프록시없이)에서 webapp는 두 설정에서 올바르게 작동합니다 : remember-me와 remember-me없이.

보안-context.xml에

<bean id="csrfSecurityRequestMatcher" class="com.XXX.YYY.config.CsrfSecurityRequestMatcher"></bean> 

<security:form-login 
      authentication-success-handler-ref="customAuthenticationSuccessHandler" 
      authentication-failure-url="/login?error" 
      login-page="/login" 
      password-parameter="lgPassword" 
      username-parameter="lgUsername" /> 

     <security:logout 
      success-handler-ref="customLogoutSuccessHandler" 
      logout-url="/logout" 
      invalidate-session="true" /> 

     <security:csrf 
      request-matcher-ref="csrfSecurityRequestMatcher" 
      disabled="false" /> 

     <security:remember-me 
      user-service-ref="customUserDetailsService" 
      token-repository-ref="customPersistentTokenRepository" 
      remember-me-parameter="lgRememberMe" 
      remember-me-cookie="TRMMBRM" 
      token-validity-seconds="7776000" /> 

     <security:session-management> 
      <security:concurrency-control 
       max-sessions="1" 
       expired-url="/login" /> 
     </security:session-management> 

web.xml을 (설정 내 의견이 경우 더 중요 ...)

... 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
... 
<filter> 
    <display-name>springSecurityFilterChain</display-name> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<!-- Session Configuration--> 
<session-config> 
    <session-timeout>1</session-timeout> <!-- (in minutes (1 min for test) --> 
</session-config> 

  • JVM 버전 : 1.8.0_151-b12
  • 스프링 MVC 4.3.5.RELEASE
  • 봄 보안 4.2.1.RELEASE
  • 아파치/2.4.6 (CentOS는)
  • 아파치 톰캣/7.0.76

내가 토큰 너무 CSRF를 활성화해야 방법에 대한 요청 및 필터 요청을 피하기 paypal 방법을 피하기 때문에.보안 spring.xml의 구성

CsrfSecurityRequestMatcher.java (I는이 문제에 대한 중요한 경우 잘 모릅니다 -이이 켜지지 않은 경우>무시)

package com.XXX.YYY.config; 

import java.util.regex.Pattern; 
import javax.servlet.http.HttpServletRequest; 
import org.springframework.security.web.util.matcher.AntPathRequestMatcher; 
import org.springframework.security.web.util.matcher.RequestMatcher; 

public class CsrfSecurityRequestMatcher implements RequestMatcher { 
    private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$"); 

    // Deshabilitamos la protección CSRF de las siguientes URLs: 
    private AntPathRequestMatcher[] requestMatchers = { new AntPathRequestMatcher("/paypal/**") }; 

    @Override 
    public boolean matches(HttpServletRequest request) {   
     if(allowedMethods.matcher(request.getMethod()).matches()){ 
      return false; 
     } 

     // Si la peticion coincide con el patrón a ignorar deshabilitamos la protección CSRF 
     for (AntPathRequestMatcher rm : requestMatchers) { 
      if (rm.matches(request)) { return false; } 
     } 

     return true; 
    } 
} 

답변

0

나는 마지막으로이 문제를 해결 : SPR의 Spring Security: invalid-session-url versus logout-success-url

  • 공식 문서 : 비슷한 문제에

    1. 링크 보내고 보안 : https://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-session-mgmt
    2. 찾고 노트 [8] https://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ftn.d0e1047

    [8] 프록시 뒤에 응용 프로그램을 실행하는 경우, 당신은 또한 프록시 서버를 구성하여 세션 쿠키를 제거 할 수 있습니다 .

    <LocationMatch "/tutorial/j_spring_security_logout"> 
    Header always set Set-Cookie "JSESSIONID=;Path=/tutorial;Expires=Thu, 01 Jan 1970 00:00:00 GMT" 
    </LocationMatch>