1

我在 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--> 导致访问被拒绝。

但是,当我进行回发时,例如

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

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

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

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

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

编辑 :

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

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

但是,我不想每次都做 PRG,而且 PRG 并不能消除安全问题。

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

4

1 回答 1

1

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

所以你肯定需要 PRG 模式,或者更好的是普通的 GET 链接。它还会立即使您的 web 应用程序对 SEO 更友好,并且可以更好地添加书签。无论如何,使用 POST 进行页面到页面导航都是不好的设计。

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

于 2012-07-30T20:15:32.747 回答