我使用 Glassfish JDBC 领域对用户进行身份验证,因此身份验证过程由其容器管理。我需要使用用户名/电子邮件地址作为用户名。用户 ID 和电子邮件地址在 postgres 用户表中都有不同的列,我正在使用 JPA。简而言之,用户可以通过其用户名或电子邮件登录。
我已经以编程方式编写了登录和注销方法。登录只有两个参数
request.login(用户名,密码);
在谷歌上搜索后,我怀疑我必须以某种方式使用我不知道的用户提供程序。
在下图中,我可以输入 USERID,因为我也希望有 EMAIL 列。
任何建议/提示/想法都会受到重视。
最佳答案
您可以采取多种方法:
如果您对用户名不感兴趣,而只是对用户身份验证正确这一事实感兴趣,则可以使用数据库 View 将用户 ID 和电子邮件合并到一列中:
创建 View vUsers AS
从用户中选择用户 ID、密码,其中用户 ID 不为空
联合所有
从电子邮件不为空的用户中选择电子邮件、密码(请注意,此语法预计不会起作用)
您现在可以将 JDBC 配置重定向到该 View 。这可能不是您不想走的路。在大多数情况下,身份验证后会根据登录名做出一些决定。现在可以是电子邮件或用户 ID。同一个人的登录名最好是唯一的。
通过
HttpServletRequest#login
登录前处理用户名:
由于用户 ID 和电子邮件通常采用不同的格式,因此您可以决定用户在登录表单中提供哪一种。- 如果是userid,则可以直接使用
HttpServletRequest#login
方法。 - 如果是电子邮件,您可以查找该电子邮件的用户 ID,然后使用
HttpServletRequest#login
。
这边走。您不能再使用 glassfish 表单登录,但最终总是以用户 ID 作为登录名。
参见https://docs.oracle.com/cd/E19798-01/821-1841/gircj/index.html
- 如果是userid,则可以直接使用
编写您自己的登录模块:
您可以编写自己的 JAAS 登录模块。那里有几个教程。 不过,这基本上可以归结为区分电子邮件和用户 ID,因此方法 2 应该足够了。
关于java - 基于 JSF JDBC 领域表单的身份验证搜索(按用户名和电子邮件地址),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39914485/