2008-12-07 32 views
1

我的web應用程序有一個用戶通過JSP登錄的安全區域。 JSP將用戶名和密碼發送給一個servlet,然後該servlet檢查用戶憑證是否有效。如果它們有效,那麼用戶被定向到安全資源。我怎樣才能確保用戶不能只在沒有首先驗證的情況下導航到安全資源?確保用戶在Java Web App中被驗證

+0

我認爲聲明式身份驗證不是應用程序的選項(通過部署描述符進行容器管理的身份驗證)。 – McDowell 2008-12-07 22:10:33

回答

6

一種常見的方法是設置一個令牌在用戶的會話即

session.setAttribute("loggedIn", "true");

甚至

session.setAttribute("loggedInUser", "someUserName");

,檢查應確保在任何網頁上。一個好的策略是使用附加到要保護的任何頁面的servlet篩選器執行檢查。如果他們沒有通過檢查,過濾器可以重定向到登錄頁面。此外在這裏看到:http://java.sun.com/products/servlet/Filters.html

這是使用過濾器進行身份驗證也是一個很好的文章:http://www.developer.com/java/ent/article.php/3467801

+0

爲什麼這種方法比容器管理的認證更好? – erickson 2008-12-09 01:57:43

+0

這取決於你的需求。對於一個簡單的應用程序來說,這很容易,但cma是針對更高級需求的一個強健的解決方案。一如往常,你的里程可能會有所不同 – mtruesdell 2008-12-09 16:14:57

0

確保人們總是通過一個單一的servlet,其中該servlet dispataches請求到JSP訪問你的應用程序,並返回由此產生的對瀏覽器的響應。這樣,您將始終掌控發生的情況,因爲有一個入口點。

一個不同的方法是有一個會話變量(服務器端,甚至在一個cookie中),它被每個需要驗證的JSP檢查。

4

什麼回合使用安全contraint在你的web.xml:

<security-constraint> 
     <web-resource-collection> 
     <web-resource-name>Secure</web-resource-name> 
     <url-pattern>/secure/*</url-pattern> 
     </web-resource-collection> 
0

安全真的是很難得到正確。比你通常想象的要多得多。使用框架(想起Acegi),或者web.xml中的標準「」部分作爲LenW pointed out是必須的!至少使用過濾器來處理安全性的授權部分。

我真的不喜歡使用單一入口點的解決方案(如suggested by Rolf)。在我看來,就像對你的架構施加了一個人爲約束。在webapp中有多個servlet是有很多好理由的。不管你做什麼,都不要使用在每個頁面上都依賴手動代碼的技術(比如:每個JSP都以「if user_authentified ...」開頭)。你會忘記把它放在什麼地方...