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;
}
}