2012-07-30 52 views
1

我有一个安全限制在web.xml中声明:的Servlet 3.0奇怪的声明安全行为

<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请求总是被拒绝。

编辑:

我曾尝试重定向后得到,并且取得了奇怪的行为消失,符合市场预期。

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

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

我在这里错过了什么?感谢任何见解!

+0

因此,起初您正在访问公共目录中的资源,然后转向屏幕,并且如预期的那样,它不会限制该资源。但之后,你尝试再次查看相同的视图我的意思是/ public/- > /screens/user.xhtml - > /screens/user.xhtml – Ravi 2012-07-30 16:01:48

+0

这似乎并不重要,无论我第一次查看/公开还是不公开。如果我尝试通过回发查看/屏幕下方的任何屏幕(例如/screens/xxxx.xhtml),我将获得上述交替行为(在显示屏幕和发出403之间来回切换)。当我提交GET时,交替行为就会消失。 – 2012-07-30 17:53:58

回答

1

安全约束未在转发中进行检查,而是在请求上进行检查。这是设计。

所以你绝对需要PRG模式或更好的正常GET链接。它会立即使您的Web应用程序更加易于使用,并且可以加入更多书签。无论如何,使用POST进行页面到页面导航都是糟糕的设计。

您所看到的“交替行为”是因为未检查到转发,但在同一页上的任何后续(回发)请求都是完全合格的请求,因此需要进行检查。

+0

谢谢,我将使用GET链接。但是,这是否意味着即使我使用GET链接,我的Web应用程序也会被发布POST的客户利用,这会利用未经检查的转发?因为安全约束没有在转发时进行检查,我是否应该仅仅依靠声明式安全来防止未经授权的访问页面? – 2012-07-30 21:57:58

+0

只有当您使用POST进行页面到页面导航时,无论如何这都是一个糟糕的做法。 – BalusC 2012-07-30 22:33:58