我在我的 Java EE 应用程序中使用基于表单的身份验证配置了 GlassFish JDBC 领域,所以一切正常。
但我想获取用户的信息(user_id),并且我想在他的会话期间将其保存在列表中。在他的会话超时或发生注销后,我会将其从该列表中删除。
我应该更改身份验证方法吗?
我在我的 Java EE 应用程序中使用基于表单的身份验证配置了 GlassFish JDBC 领域,所以一切正常。
但我想获取用户的信息(user_id),并且我想在他的会话期间将其保存在列表中。在他的会话超时或发生注销后,我会将其从该列表中删除。
我应该更改身份验证方法吗?
不幸的是,Java EE 安全 API 不够丰富,无法提供有关已登录用户的详细信息。
您唯一可以要求的是用户用于登录的名称。您可以通过HttpServletRequest#getUserPrincipal#getName或替代HttpServletRequest#getRemoteUser来执行此操作。
有一些解决方法:
在 Servlet 过滤器中,检查您所说的这个“列表”是否为空,并且上述任何一种方法都返回非空值。如果此条件成立,请根据用户名手动查询您的用户详细信息,并将其放入此“列表”中。(我不太确定您为什么专门为此使用列表,但除此之外)
确实将 auth 方法更改为编程变体。这意味着您可以构建自己的表单、对话框或其他任何内容。然后在您的支持代码中(如果使用 JSF,则支持 bean,否则为 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