我需要爲我的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>
我不確定我是否瞭解您的具體問題。只需指定'/ *'應該按照標準的Servlet API URL模式匹配規則工作(例如'/ admin/*'比'/ *'更具體,因此將使用它的約束)。你有沒有試過它,它究竟是如何失敗? – BalusC
好吧,我試圖排除'/ admin/*'和'/ account/*',這樣我就可以根據他的角色使用這些角色來確定是否有人被允許「/ admin/*」。一個'url-pattern' =/*就足以要求HTTPS連接,但它不會阻止普通用戶訪問'/ admin/*'。或者它會,因爲它被排除在第一條規則之外? – Aquillo
根據你的配置,'/ admin/*'需要'admin',而不是'visitor'。由於'/ admin/*'比'/ *'更具體,所以勝利了(參見servlet 3.0規範12.1章節)。就那麼簡單。現在,你有沒有嘗試過它,它究竟是如何失敗?如果你根本沒有嘗試過,那麼這個問題實際上應該是「修辭」。請相應地重寫問題。 – BalusC