java - 基于 JSF JDBC 领域表单的身份验证搜索(按用户名和电子邮件地址)

标签 java security jsf jakarta-ee glassfish

我使用 Glassfish JDBC 领域对用户进行身份验证,因此身份验证过程由其容器管理。我需要使用用户名/电子邮件地址作为用户名。用户 ID 和电子邮件地址在 postgres 用户表中都有不同的列,我正在使用 JPA。简而言之,用户可以通过其用户名或电子邮件登录。

我已经以编程方式编写了登录和注销方法。登录只有两个参数

request.login(用户名,密码);

在谷歌上搜索后,我怀疑我必须以某种方式使用我不知道的用户提供程序。

enter image description here

在下图中,我可以输入 USERID,因为我也希望有 EMAIL 列。 enter image description here

任何建议/提示/想法都会受到重视。

最佳答案

您可以采取多种方法:

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

    创建 View vUsers AS
    从用户中选择用户 ID、密码,其中用户 ID 不为空
    联合所有
    从电子邮件不为空的用户中选择电子邮件、密码

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

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

  2. 通过 HttpServletRequest#login 登录前处理用户名:
    由于用户 ID 和电子邮件通常采用不同的格式,因此您可以决定用户在登录表单中提供哪一种。

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

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

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

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

关于java - 基于 JSF JDBC 领域表单的身份验证搜索(按用户名和电子邮件地址),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39914485/

相关文章:

asp.net-mvc - CRSF 和 SSL 证书

java - Primefaces InputStream 在文件下载中生成损坏的 PDF

javascript - 如何使用正则表达式解析OData参数?

java - 如何以编程方式将私钥添加到 Windows 证书存储

security - 我怎么知道OpenSSL ChaCha密码中的SHA类型

jsf - 命令按钮在第二次按下时调用操作 (jsf)

java - a4j :support function getting called only once in h:commandLink

java - 使用 Java 和 JSP 按行迭代表时丢失数据

java - Maven Web 应用程序 - 通过 sysdeo 插件运行 Tomcat 而不是检索 .properties

java - 广播服务没有被调用