JSF JDBC 基于领域表单的用户名和电子邮件地址身份验证搜索
JSF JDBC realm form based authentication search by username and email address
我正在使用 Glassfish JDBC 领域进行用户身份验证,因此身份验证过程由其容器管理。我需要使用 userid/email 地址作为用户名。用户 ID 和电子邮件地址在 postgres 用户 table 中都有不同的列,我正在使用 JPA。简而言之,用户可以通过其用户 ID 或电子邮件登录。
我以编程方式编写了登录和注销方法。登录只有两个参数
request.login(username, password);
在 google 上搜索后,我怀疑我必须以某种方式使用我不知道的用户提供程序。
在下图中,我可以通过输入 USERID 我也希望有 EMAIL 列。
任何 suggestions/hint/idea 都将是可观的。
您可以采用以下几种方法:
如果您对用户名不感兴趣,而只是对用户身份验证正确这一事实感兴趣,您可以使用数据库视图将用户 ID 和电子邮件联合到一列中:
创建视图 vUsers
SELECT userid,来自 userid 不为 NULL 的用户的密码
联合所有
SELECT 电子邮件不为空的用户的电子邮件、密码
(注意此语法预计不会起作用)
您现在可以将 JDBC 配置重定向到该视图。
这可能不是您不想走的路。在大多数情况下,在身份验证之后,一些决定是根据登录名做出的。这现在可以是电子邮件或用户 ID。同一个人的唯一登录名更好。
通过HttpServletRequest#login
登录前处理用户名:
因为 userid 和 email 通常是不同的格式,您可以决定用户在登录表单中提供的是哪一种。
- 如果是userid,可以直接使用
HttpServletRequest#login
方法。
- 如果是电子邮件,您可以查找电子邮件的用户 ID,然后使用
HttpServletRequest#login
。
这边。您不能再使用 glassfish 表单登录,但您总是以用户 ID 作为登录名。
见https://docs.oracle.com/cd/E19798-01/821-1841/gircj/index.html
编写自己的登录模块:
您可以编写自己的 JAAS 登录模块。那里有几个教程。
尽管如此,这基本上可以归结为区分电子邮件和用户标识,因此方法 2 应该足够了。
我正在使用 Glassfish JDBC 领域进行用户身份验证,因此身份验证过程由其容器管理。我需要使用 userid/email 地址作为用户名。用户 ID 和电子邮件地址在 postgres 用户 table 中都有不同的列,我正在使用 JPA。简而言之,用户可以通过其用户 ID 或电子邮件登录。
我以编程方式编写了登录和注销方法。登录只有两个参数
request.login(username, password);
在 google 上搜索后,我怀疑我必须以某种方式使用我不知道的用户提供程序。
在下图中,我可以通过输入 USERID 我也希望有 EMAIL 列。
任何 suggestions/hint/idea 都将是可观的。
您可以采用以下几种方法:
如果您对用户名不感兴趣,而只是对用户身份验证正确这一事实感兴趣,您可以使用数据库视图将用户 ID 和电子邮件联合到一列中:
创建视图 vUsers
SELECT userid,来自 userid 不为 NULL 的用户的密码
联合所有
SELECT 电子邮件不为空的用户的电子邮件、密码(注意此语法预计不会起作用)
您现在可以将 JDBC 配置重定向到该视图。这可能不是您不想走的路。在大多数情况下,在身份验证之后,一些决定是根据登录名做出的。这现在可以是电子邮件或用户 ID。同一个人的唯一登录名更好。
通过
HttpServletRequest#login
登录前处理用户名:
因为 userid 和 email 通常是不同的格式,您可以决定用户在登录表单中提供的是哪一种。- 如果是userid,可以直接使用
HttpServletRequest#login
方法。 - 如果是电子邮件,您可以查找电子邮件的用户 ID,然后使用
HttpServletRequest#login
。
这边。您不能再使用 glassfish 表单登录,但您总是以用户 ID 作为登录名。
见https://docs.oracle.com/cd/E19798-01/821-1841/gircj/index.html
- 如果是userid,可以直接使用
编写自己的登录模块:
您可以编写自己的 JAAS 登录模块。那里有几个教程。 尽管如此,这基本上可以归结为区分电子邮件和用户标识,因此方法 2 应该足够了。