Servlet 3.0奇怪的声明性安全行为

时间:2012-07-30 00:11:17

标签: jsf-2 servlet-3.0

我在web.xml中声明了一个安全约束:

    <security-constraint>
    <web-resource-collection>
        <web-resource-name>LoggedIn</web-resource-name>
        <url-pattern>/screens/*</url-pattern>
    </web-resource-collection>
    <auth-constraint/>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

登录后,当我针对应用程序发出GET请求时,我得到了预期的行为,例如

https://localhost:8443/Patrac/screens/user.xhtml - &gt;导致拒绝访问。

然而,当我做回发时,例如

<rich:menuItem submitMode="ajax" label="User" action="/screens/user"/>

我可以查看屏幕。如果我做第二次相同的回发,我会收到拒绝访问的消息。每次提交回发时,结果在显示屏幕和发出403之间交替显示。浏览器中显示的URL在以下内容之间交替显示:

https://localhost:8443/Patrac/screens/user.xhtml - &gt;访问被拒绝时的浏览器URL

https://localhost:8443/Patrac/public/403.xhtml - &gt;显示用户屏幕时的浏览器URL

我理解JSF中显示的浏览器URL落后于当前显示的屏幕的方式,所以这并不神秘。但我不明白我每次提交相同的回发时都能看到屏幕。同样,GET请求总是被拒绝。

编辑:

我确实尝试了post-redirect-get,这让奇怪的行为消失了,正如预期的那样。

<rich:menuItem submitMode="ajax" label="User" action="/screens/user?faces-redirect=true"/>

但是,我不想每次都做PRG,除了PRG并没有消除安全问题。

我在这里缺少什么?感谢您的任何见解!

1 个答案:

答案 0 :(得分:1)

安全约束不会在转发时检查,而是在请求时检查。这是设计的。

所以你肯定需要PRG模式或更好的正常GET链接。它会立即使您的webapp更加SEO友好和更好的书签。无论如何,使用POST进行页面到页面导航都是糟糕的设计。

您看到的“交替行为”是因为未检查转发,但同一页面上的任何后续(回发)请求都是完整的请求,因此会进行检查。