我在我的Java EE應用程序中使用基於表單的身份驗證配置了GlassFish JDBC領域,因此,一切正常。基於Glassfish Form的安全性獲取用戶信息
但我想獲取用戶的信息(user_id),並且我想在會話期間將它保留在列表中。在他的會話超時或發生註銷後,我將從此列表中刪除它。
我應該改變auth方法嗎?
我在我的Java EE應用程序中使用基於表單的身份驗證配置了GlassFish JDBC領域,因此,一切正常。基於Glassfish Form的安全性獲取用戶信息
但我想獲取用戶的信息(user_id),並且我想在會話期間將它保留在列表中。在他的會話超時或發生註銷後,我將從此列表中刪除它。
我應該改變auth方法嗎?
不幸的是,Java EE安全API不夠豐富,無法提供有關已登錄用戶的詳細信息。
您唯一可以要求的是用戶用來登錄的名稱。你可以通過HttpServletRequest#getUserPrincipal#getName或者替代HttpServletRequest#getRemoteUser來做到這一點。
有幾個解決方法:
在Servlet過濾器,檢查該「清單」你說的是空的,要麼上述方法返回一個非空值。如果此條件成立,請根據用戶名手動查詢您的用戶詳細信息並將其放入此「列表」中。 (我真的不知道爲什麼你專門使用一個列表,不過那一邊)
確實改變身份驗證的方法來一個綱領性變種。這意味着你建立自己的表單,對話框或其他任何東西。然後在你的後臺代碼(支持bean,如果使用JSF,否則是一個Servlet或其他)加載用戶詳細信息,並用這些詳細信息中的用戶名稱調用HttpServletRequest#login。如果此通話成功,請立即將您的擴展用戶信息放入「列表」中。
(高級方法)使用自定義驗證模塊(例如通過JASPIC),並讓此驗證模塊委託您的應用程序中的代碼。此基於應用程序的代碼然後將用戶名和角色返回到容器,同時將用戶詳細信息放入HTTP會話中。這種方法的優點是你有一個地方的用戶登錄/加載代碼,並且它也做了一次。在JDBC領域,代碼(查詢)位於兩個地方,並且也執行兩次。
我建議先嚐試選項1或2。如果您想追求先進的方法,請查看http://jdevelopment.nl/open-source/java-ee-kickoff-app。
如果你煩惱的是Java EE的沒有一個更簡單,更強大的機制來做到這一點的開箱,請考慮投票針對此問題:https://java.net/jira/browse/JAVAEE_SPEC-9
謝謝您的回答。我將我的安全方法改爲使用Apache Shiro進行編程。我認爲Shiro很好,而且其他大多數實現都更容易使用。 – erdoganonur