2012-07-30 35 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