当前位置: 首页 > 知识库问答 >
问题:

Apache代理在会话过期后不能通过remember-me令牌正确恢复会话

蒋岳
2023-03-14

我在Spring Security中启用remember-me选项时出现了一个奇怪的错误。当会话过期时,我可以导航我的其余网页,但注销和其他POST方法在服务器中产生错误。它们不起作用,因为我的控制器重用了GET方法而不是post方法。我不明白为什么。

首先,我有一个Apache httpd服务作为代理使用ProxyPass配置。我将我的.war部署为root.war,因为我想访问我的域名www.example.com而不指明应用程序名称(在其他单词中,我不想指明www.example.com/appname)

我阅读了大量关于这种情况的文档,我在virtal host中的配置有以下几行:

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]

我在相同的环境中测试了应用程序,但禁用了security-context.xml中的remember-me配置,部署root.war,并在会话过期时测试应用程序...还有....我被正确地重定向到登录页面。

在本地tomcat(没有apache代理)中,我的webapp在两种配置下都能正常工作:有remement-me和没有remement-me。

security-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>
...
<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>
    null

csrfsecurityrequestmatcher.java(我不知道这对这个问题是否重要->如果这不重要,请忽略)

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

共有1个答案

罗甫
2023-03-14

我终于解决了这个问题:

  1. 链接到类似的问题:Spring Security:invalce-session-url与logout-success-url
  2. Spring Security的官方文档:https://docs.Spring.io/Spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-session-mgmt
  3. 查看注意[8]https://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ftn.d0e1047

[8]如果在代理后面运行应用程序,还可以通过配置代理服务器来删除会话cookie。

<LocationMatch "/tutorial/j_spring_security_logout">
Header always set Set-Cookie "JSESSIONID=;Path=/tutorial;Expires=Thu, 01 Jan 1970 00:00:00 GMT"
</LocationMatch>
 类似资料:
  • 我在Tomcat7中有一个web应用程序,它将会话中的用户信息作为DTO对象保存。我还为我的项目启用了Spring Security性,如果用户没有会话,它会自动将用户重定向到登录页面。 如果我登录到应用程序一次,然后在Eclipse中重新启动Tomcat,会发生的情况是,我的会话被冲出,但cookie没有运行。 Edit:尽管Firefox说,但如果关闭并重新启动Firefox,cookie仍然

  • 我正在构建一个移动网络应用程序,它可以通过Facebook/Twitter登录。我想让应用程序通过Spring Security的remember me功能记住登录,这样用户就需要经常登录。 我有部分将调用facebook并获得access_token来识别用户。我可以使用 当它登录用户时,它不会设置remember me cookie。我错过了什么? 谢谢!

  • 问题内容: 我(几乎)成功地将Node.js与Express和Redis结合使用来处理会话。 我遇到的问题是使用时不保留会话。 这是我的看到方式: console.log()打印: 现在,这是以下代码: 这个console.log()打印出: 显然,“用户名”对象已消失。该会话没有保留它,而是重新构建了一个新会话。 我该如何解决?如果您需要任何信息,请不要犹豫。 这是我设置会话管理的代码: 这是基

  • 问题内容: 我们的应用程序在30分钟后注销并重定向到登录页面,我在web.xml中指定会话超时,并使用requestProcessor进行重定向。我想向用户显示一条消息,指出会话过期后会话已过期,如何我可以这样做吗?自动注销?我想在“会话超时,请重新登录”页面上提示错误消息。那我怎么能检测到会话超时呢?有什么方法会自动触发吗? 问题答案: 创建一个活动检查器,该检查器每分钟检查是否发生了任何用户活

  • 我试图从URL列表中下载.html中的网页,但其中一些网站使用会话cookie,当我尝试Jsoup.connect(“URL”)时,我得到了403。 因此,我使用了Map/HashMap作为如何使用Jsoup管理cookies、维护cookies、使用Jsoup进行会话、检索cookies..,但仍然是403。 真正让我吃惊的是,一个像Mac Automator这样简单的应用程序可以完成这项工作,

  • 我有一个cordova应用程序,我有一个登录页面和一个登录用户的内页。每当用户会话消失时,它就会请求登录信息。如何防止ths cordova应用程序在重启移动应用程序时删除会话uppon重启或恢复cookie和会话信息?所以登录屏幕不会每次都出现?