【问题标题】:Spring security does not behave properly when session is reset重置会话时 Spring 安全性无法正常运行
【发布时间】:2013-06-13 05:08:03
【问题描述】:

我重新启动服务器,这基本上清除了会话的所有内容。由于会话已被清除,用户不能再被视为已登录。(JSESSIONID cookie 保留在浏览器中)

但除非我从浏览器中删除 JESSIONID cookie,否则 spring 不会重定向到登录。 我的问题是 - 为什么 spring security 依赖 JESSIONID cookie 而不是 session?

这是我的 spring-security.xml 配置 -

    <security:global-method-security
        secured-annotations="enabled" />

    <security:http auto-config="true">
        <!-- Restrict URLs based on role -->
        <security:intercept-url pattern="/portal/login*"
            access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/logoutSuccess*"
            access="IS_AUTHENTICATED_ANONYMOUSLY" />

        <security:intercept-url pattern="/**/*.css"
            access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/**/*.js"
            access="IS_AUTHENTICATED_ANONYMOUSLY" />    

        <security:intercept-url pattern="/portal/**"
            access="ROLE_USER, ROLE_ADMIN" />

        <security:form-login login-page="/portal/login.action"
            login-processing-url="/portal/loginProcess" default-target-url="/portal/index"
            authentication-failure-url="/portal/login.action?login_error=1" />

        <security:logout logout-url="/portal/logout"
            logout-success-url="/portal/login.action" />

    </security:http>

    <security:authentication-manager>
        <security:authentication-provider>

            <security:jdbc-user-service
                data-source-ref="dataSource"
                users-by-username-query="SELECT emailid AS username, password, IF(active = 'Y', true, false) AS enabled FROM users WHERE emailid = ?"
                authorities-by-username-query="SELECT username, authority from authorities where username = ?" />
        </security:authentication-provider>
    </security:authentication-manager>

【问题讨论】:

  • 如果您没有从 Web 浏览器中删除 cookie 并且服务器没有将您重定向到日志记录页面,会发生什么情况?它的行为就像您已登录一样(您可以看到受保护的资源等)?
  • @Poitrek 是的。它的行为就像用户已登录一样。

标签: spring spring-security


【解决方案1】:

我的问题是 - 为什么 spring security 依赖于 JESSIONID cookie 和 不在会话中

您必须启用基于 cookie 的会话。如果您使用的是 tomcat 7,您的 web.xml 中可能有类似的内容

<session-config>
  <!-- Disables URL-based sessions (no more 'jsessionid' in the URL using Tomcat) -->
  <tracking-mode>COOKIE</tracking-mode>
</session-config>

删除它。

【讨论】:

    【解决方案2】:

    我重新启动服务器,这基本上清除了所有内容 会议。由于会话已被清除,用户无法 不再被视为已登录。

    根据您的评论,服务器重新启动后应用程序的行为就像用户已登录,我怀疑您启用了会话持久性(默认情况下在 Tomcat/JBoss 上启用),因此您实际上已登录(相同的 JSESSIONID)。此外,您可能会丢失会话内容,因为您放入会话的对象不可序列化。

    根据 Tomcat 文档(在这种情况下 JBoss 的行为类似):

    禁用会话持久性 如上所述,每个 Web 应用程序 默认情况下配置了标准管理器实现,并且它 跨重启执行会话持久性。要禁用此 持久性功能,为您的网络创建一个上下文配置文件 应用程序并在其中添加以下元素:

    <Manager pathname="" />
    

    【讨论】:

      猜你喜欢
      • 2013-09-21
      • 2020-09-05
      • 2016-04-04
      • 2019-11-15
      • 2023-03-17
      • 2014-07-17
      • 2014-03-25
      • 2015-08-05
      • 2011-06-04
      相关资源
      最近更新 更多