2013-04-02 50 views
4

我需要爲我的web應用程序的三個不同部分定義安全約束。一個用於/admin/*,一個用於/account/*,並且是一個棘手的問題。最後一個應該匹配除前面的url模式(/*,不包括/admin/*/account/*)之外的所有內容。我如何創建這個約束?多重安全約束:排除前面的url模式的最後一個

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>AdminPanel</web-resource-name> 
     <url-pattern>/admin/*</url-pattern> 
    </web-resource-collection>  
    <auth-constraint> 
     <role-name>admin</role-name> 
    </auth-constraint> 
    <user-data-constraint>  
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
     </user-data-constraint> 
    </security-constraint> 

    <security-constraint> 
    <web-resource-collection> 
     <web-resource-name>AccountPanel</web-resource-name> 
     <url-pattern>/account/*</url-pattern> 
    </web-resource-collection>  
    <auth-constraint> 
     <role-name>account</role-name> 
    </auth-constraint> 
    <user-data-constraint>  
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
     </user-data-constraint> 
    </security-constraint> 

    <security-constraint> 
    <web-resource-collection> 
     <web-resource-name>HTTPSOnly</web-resource-name> 
     <url-pattern>`/* excluding /admin/*, /account/*`</url-pattern> 
    </web-resource-collection>  
    <auth-constraint> 
     <role-name>visitor</role-name> 
    </auth-constraint> 
    <user-data-constraint>  
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
     </user-data-constraint> 
    </security-constraint> 
+1

我不確定我是否瞭解您的具體問題。只需指定'/ *'應該按照標準的Servlet API URL模式匹配規則工作(例如'/ admin/*'比'/ *'更具體,因此將使用它的約束)。你有沒有試過它,它究竟是如何失敗? – BalusC

+0

好吧,我試圖排除'/ admin/*'和'/ account/*',這樣我就可以根據他的角色使用這些角色來確定是否有人被允許「/ admin/*」。一個'url-pattern' =/*就足以要求HTTPS連接,但它不會阻止普通用戶訪問'/ admin/*'。或者它會,因爲它被排除在第一條規則之外? – Aquillo

+1

根據你的配置,'/ admin/*'需要'admin',而不是'visitor'。由於'/ admin/*'比'/ *'更具體,所以勝利了(參見servlet 3.0規範12.1章節)。就那麼簡單。現在,你有沒有嘗試過它,它究竟是如何失敗?如果你根本沒有嘗試過,那麼這個問題實際上應該是「修辭」。請相應地重寫問題。 – BalusC

回答

1

你有三個不同的角色定義即,管理員,帳戶和訪問者。

你的第一個約束說,只有管理員角色可以訪問的資源/管理/ *

你的第二個制約因素說,只有帳戶可以訪問的資源/帳號/ *

此時(無第三約束)設想一個訪問者角色(或任何其他角色)嘗試訪問管理員和帳戶目錄中的任何內容。由於前兩條規則,它將無法訪問它。它只能訪問管理員和帳戶目錄以外的資源。

所以你想要的是前2個約束已經實現了,在我看來你不需要第三個約束。

+0

第三個約束是必要的,因爲「其他」資源需要「訪問者」角色。如果您省略第三個約束,**任何**都可以訪問「其他」資源。 – BalusC

+0

你說什麼是正確的,以防** **訪客**不同於**任何**。我假設訪問者角色相當於任何人(源於所要求的訪問類型)。如果訪問者與任何人不同,那麼是否有任何資源受到保護,但訪問者無法訪問?我想不是。 – prashant

+0

「任何人」根據規範具有「*」而不是「訪客」的角色。 – BalusC