注销后单击后退按钮后页面不安全

时间:2013-05-29 16:46:58

标签: javascript spring spring-mvc mobile spring-security

在我之前的工作中,我遇到了一个众所周知的问题,即无法阻止用户在退出后使用后退按钮导航网站。我的技术包括Spring,JavaScript以及Java AJAX库ZK的Mobile模块。除了使用后退按钮导航外,授权访问也起作用。我无法再访问应用程序代码。该应用程序是移动应用程序,我不是原作者。

我尝试了以下常见解决方案:


我们在t2-spring-security-context.xml中有以下定义:

<http auto-config="true">
    <intercept-url pattern="/mobile-index*" access="ROLE_ADMIN"/>
    <intercept-url pattern="/t2-metrics*" access="ROLE_ADMIN"/>
    <intercept-url pattern="/t2-monitor*" access="ROLE_ADMIN"/>
    <form-login login-page="/login.jsp" authentication-failure-url="/loginerror.jsp"
                default-target-url="/mobile-index.jsp"/>
    <logout logout-success-url="/login.jsp" invalidate-session="true"/>

</http>


我们实施的其他细节:

  • 使用注释为@RequestMapping的类在JavaScript中使用@Controller调用Java方法(I.E. t2-metrics.jsp将JS激发到URL匹配请求映射)
  • 尝试将security:global-method-security添加到应用程序上下文和角色注释到方法
  • 使用scriptlet代码禁用对JSP页面的缓存,并且不执行任何操作。此外,在IntelliJ中调试应用程序,并且我的定义过滤器中的调试点未被命中。
  • 一旦他们使用后退按钮返回应用程序,用户仍然可以浏览应用程序。

我唯一的想法是,问题涉及我们的客户端代码(JavaScript)或库(与Spring Security的错误集成),因为调试没有达到Spring Security过滤器链。

4 个答案:

答案 0 :(得分:9)

在servlet-context文件中使用以下代码

    <mvc:interceptors>
        <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
                <property name="cacheSeconds" value="0"/>
                <property name="useExpiresHeader" value="false"/>
                <property name="useCacheControlHeader" value="true"/>
                <property name="useCacheControlNoStore" value="true"/>
            </bean>     
        </mvc:interceptors>

它将与jsp页面中的以下代码相同:

  response.setHeader("pragma", "no-cache");              
  response.setHeader("Cache-control", "no-cache, no-store, must-revalidate");             
  response.setHeader("Expires", "0"); 

答案 1 :(得分:2)

您是直接渲染视图(JSP)吗?

如果是这样,请将no-cache指令直接添加到JSP:

<% response.setHeader("Cache-Control", "no-cache"); %>
...

另一个(首选)选项是阻止直接访问JSP并通过控制器呈现它们:

@RequestMapping(value = "/login", method = GET)
public String renderLoginPage() {
    return "login";
}

使用此方法按名称解析视图(从控制器方法返回的字符串):

<bean
    id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:prefix="/WEB-INF/views" p:suffix=".jsp"
/>

/WEB-IBF/views/login.jsp作为视图。

使用后者方法可以使用WebContentInterceptor方法来很好地防止缓存。

还要确保所有请求都在Spring安全过滤器链中。

答案 2 :(得分:0)

我们不使用Spring安全性,因此我不熟悉它的所有配置属性,但如果我是你,我将首先考虑浏览器缓存问题。应该很容易测试...(1)按下后退按钮强制重新加载页面,或者(2)注销后,清除浏览器缓存(不是cookie),然后点击后退按钮。如果这导致了所需的行为,那么下一步应该是包含HTTP Response Header属性来控制浏览器缓存。

如果不是这样,那么我不知道在Spring安全配置中要查找什么。希望其他人可能知道答案。

编辑:刚发现另一个确认浏览器缓存问题的类似问题 - 该问题的答案包含一种机制,用于设置响应标头以防万一,如果这有助于您 - Spring Security Logout Back Button

答案 3 :(得分:0)

不幸的是,我不能再回到这段代码来解决我们在这里所做的事情,这使我们无法得到这个问题的答案。尽管如此,开发人员可以创造出令人惊讶的东西。

虽然我认为这是答案(尚待证明),但其他答案是有用的(并且值得赞成),以及这一点。我当时认为的解决方案是前端代码,而不是使用 Spring 构造,例如 Spring Security过滤器可以管理的MVC,我们可能 使用了Spring的调度程序(参见文档here)并以某种方式绕过了过滤器技术,我记得这对于实现 Spring Security 。

我将尝试发布一些前端代码,演示我们调用REST服务的方式,并证明我们绕过了Spring Security。

如果您不同意,请随时与我联系。