【问题标题】:Authenticating users programmatically以编程方式对用户进行身份验证
【发布时间】:2014-04-13 13:43:20
【问题描述】:

我有一个模仿 Domino 登录表单的 servlet。通过目录服务对 LDAP 进行身份验证。

服务器首先检查密码是否过期。如果它还没有过期,那么它会继续对用户进行身份验证。然后,身份验证过程从 servlet 开始,通过发送模仿 Domino 的默认登录页面的 HTML,代码如下。不是很安全。

我可以调用 Java 中的 Domino 方法来从我的 servlet 中对用户进行身份验证吗?

我正在考虑进行 POST,但不确定这是否安全。

有什么想法吗?

   private void logUserIntoNotes(HttpServletResponse response) throws IOException
   {
    String action = "/names.nsf?Login";

    System.out.println("Action=" + action);
    System.out.println("Username=" + username);
    //System.out.println("Password=" + password);
    System.out.println("RedirectTo=" + redirectTo);


    response.setContentType("text/html");

    ServletOutputStream out = response.getOutputStream();
    out.println("<html><head><title>Login Page</title></head><body>");
    out.println("Logging in. Please wait ...");
    out.println("<form method=\"post\" name=\"login\" action=\"" + action + "\">");
    out.println("<input type=\"hidden\" name=\"Username\" value=\"" + username + "\">");
    out.println("<input type=\"hidden\" name=\"Password\" value=\"" + password + "\">");
    out.println("<input type=\"hidden\" name=\"RedirectTo\" value=\"" + redirectTo + "\">");
    out.println("</form>");
    out.println("<SCRIPT LANGUAGE=\"JavaScript\"> document.forms[\"login\"].submit(); </SCRIPT>");
    out.println("</body></html>");
}

【问题讨论】:

  • 你能解释一下你为什么这样做吗?为什么用户不直接以正常方式登录 Domino 服务器?
  • @Richard。一个合理的问题,但是一旦涉及到 servlet,任何事情都可能发生。
  • @Bruce,您说您检查了密码是否已过期。这意味着您已经在使用某种身份验证。 LTPAToken ?
  • 抱歉没有早点回来。 @Richard,我不只是登录的原因是我首先需要检查 PW 是否已过期。这就是 servlet 正在做的事情。 Domino 会继续让您登录,直到所有宽限登录都过期。
  • @giulo。用户存储在 LDAP 服务器上。正在使用 Domino 目录服务在 LDAP 中对用户进行身份验证。

标签: java lotus-domino


【解决方案1】:

我将从 servlet 开始。我认为您正在寻找的是 servlet 中的createSession method。它提供了多种在服务器上启动用户认证会话的方法。我用它所有的时间。有关 Java 中 Domino 对象的更多详细信息,还包括身份验证 here。尽管已经有几年历史了,但 Java API 仍然很重要。

在我的 servlet 中工作的快速代码 sn-p。

        NotesThread.sinitThread();
        try {
            session = NotesFactory.createSession("", sUsr, sPwd);
        } catch(NotesException ne) {
            // invalid username/password or something else horrible happened.
            NotesThread.stermThread();
            if (ne.id!=4486){
                System.out.println("Notes Error:" + ne.id);
                ne.printStackTrace();   
            }


        }

但是您的问题是您需要将凭据安全地发送到服务器。您可以使用 SSL,然后添加 HTTP header fields in the request at the browser,(SSL 加密标头),然后使用 HTTPServletRequest.getHeader 在 servlet 中提取值。如果您不想复制默认的 Domino 标头名称,则无需复制,因为您有一个处理数据的 servlet。您可以做任何您想做的事情,而不必特别需要复制 Domino 中的默认登录表单。

【讨论】:

  • 我可以如何做到这一点的任何例子?我必须承认,可能java技能没有那么强
  • Domino Designer 帮助文件中有许多示例将详细说明 CreateSession 方法。我在答案中添加了代码片段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2022-01-23
  • 2018-10-12
  • 1970-01-01
  • 2021-08-16
  • 2021-10-26
相关资源
最近更新 更多