2010-07-22 40 views
3

有沒有辦法只允許POST請求到j_security_check?我想拒絕GETs。 我正在使用基於表單的安全性並希望僅允許發佈到j_security_check。如果通過GET進行登錄請求,則該請求應該被拒絕。拒絕j_security_check上的GET方法

回答

1

是的,你可以拒絕GET請求。在安全性約束部分的web.xml文件中,您可以指定允許的http方法。在以下xml中,此安全約束所允許的唯一方法是POST方法。 j_security檢查將只允許post方法。

<security-constraint> 
    <display-name>Your security constraint</display-name> 
    <web-resource-collection> 
    <web-resource-name>Your resource name</web-resource-name> 
    <url-pattern>/The URL pattern</url-pattern> 
    <http-method>POST</http-method> 
    <web-resource-collection> 
<security-constraint> 
0

您需要更改您的問題。

j_security檢查通常在登錄頁面使用。

如果你請求一個受保護的資源,你沒有通過身份驗證,您將自動重定向到登錄頁面(假設應用程序被配置爲使用基於表單的安全性)

如果資源不應該被質疑的GET請求,按照Doug提到的那樣。例如,如果您希望將POST調用保護到myaccount(Servlet的模式),那麼只有在發佈HTTP Post時,即使沒有用戶身份驗證也會接受GET請求,您將被重定向到登錄頁面。

言下之意是要允許通過驗證的用戶訪問,而GET請求被允許大家POST請求。

10

已經一直在努力做一個JBoss(Tomcat)的服務器上的相同,由於使用GET方法,我試圖各種方式JAAS的安全問題。

  1. 使用URL模式/ j_security_check一個web.xml安全約束只使用POST - 這不適用於JAAS機制,因爲它會爲正常的servlet工作。

  2. 傳遞登錄詳細信息從登錄頁面,其檢查該請求的方法和如果不是GET轉發然後到j_security_check中間的servlet。 - 這沒有用,而且過於複雜。

  3. 創建一個過濾器,用於檢查請求方法,並僅在POST消息中調用j_security_check - 由於JAAS在Web容器中更深,並且在過濾器機制之前調用,所以不起作用。

  4. 創建一個閥門,這並獲得JAAS之前調用。

通過增加在invoke方法如下:

HttpServletRequest req = (HttpServletRequest) request; 
if (req.getMethod().equals("GET")) { 
log.warn("Someone is trying to use a GET method to login!!");      
request.getRequestDispatcher("/login.jsp").forward(req, response); 
throw new ServletException("Using a GET method on security check!"); 
} 

這並不工作。

0

另一種方法我正在考慮實施:

  • 阻止所有,但POST請求在像nginx的反向代理/負載均衡器到j_security_check /阿帕奇

例如在Apache 2上。4本作品:

<LocationMatch ".*j_security_check"> 
    AllowMethods POST 
</LocationMatch> 
我自己的servlet重新實現j_security_check