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

时间:2016-10-07 09:57:56

标签: java security jsf java-ee glassfish

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

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

request.login(username, password);

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

enter image description here

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

任何建议/提示/想法都会很明显。

1 个答案:

答案 0 :(得分:1)

您可以采取多种方法:

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

    创建视图vUsers AS SELECT userid,来自userid IS NOT NULL的用户的密码
    UNION ALL
    选择电子邮件,密码来自电子邮件不是空的用户

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

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

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

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

    这样。你不能再使用glassfish表单登录了,但你总是以userid作为登录名。

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

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