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 都将是可观的。

您可以采用以下几种方法:

  1. 如果您对用户名不感兴趣,而只是对用户身份验证正确这一事实感兴趣,您可以使用数据库视图将用户 ID 和电子邮件联合到一列中:

    创建视图 vUsers
    SELECT userid,来自 userid 不为 NULL 的用户的密码
    联合所有
    SELECT 电子邮件不为空的用户的电子邮件、密码

    (注意此语法预计不会起作用)
    您现在可以将 JDBC 配置重定向到该视图。

    这可能不是您不想走的路。在大多数情况下,在身份验证之后,一些决定是根据登录名做出的。这现在可以是电子邮件或用户 ID。同一个人的唯一登录名更好。

  2. 通过HttpServletRequest#login登录前处理用户名:
    因为 userid 和 email 通常是不同的格式,您可以决定用户在登录表单中提供的是哪一种。

    • 如果是userid,可以直接使用HttpServletRequest#login方法。
    • 如果是电子邮件,您可以查找电子邮件的用户 ID,然后使用 HttpServletRequest#login

    这边。您不能再使用 glassfish 表单登录,但您总是以用户 ID 作为登录名。

    https://docs.oracle.com/cd/E19798-01/821-1841/gircj/index.html

  3. 编写自己的登录模块:
    您可以编写自己的 JAAS 登录模块。那里有几个教程。 尽管如此,这基本上可以归结为区分电子邮件和用户标识,因此方法 2 应该足够了。