【问题标题】:Standard form authentication Java servlets标准表单认证 Java servlet
【发布时间】:2012-06-26 07:07:03
【问题描述】:

使用 Java Servlet 进行表单身份验证的标准方法是什么?

从现在开始,我自己使用一个简单的 POST HTML 表单实现了这一点:

  1. 对照数据库检查发送的参数
  2. 如果存在,将用户对象保存到 HttpSession 中
  3. 检查每个 Servlet 是否存在此对象
  4. 如果不是:重定向到登录页面并显示错误消息

但是现在我偶然发现了How to Configure Security with Embedded Jetty,现在我想我可以重用已经实现的解决方案来解决这个问题,但是这里的标准方法是什么?我自己在使用 Jetty,但是 Tomcat 或其他 Web 服务器呢?

我还阅读了有关 j_security_check 的信息,这是怎么回事?这是传统方法吗?

【问题讨论】:

    标签: java security authentication servlets jetty


    【解决方案1】:

    您应该使用 Tomcat、Websphere、Glassfish 等 Servlet 容器提供的 JAAS 安全性。

    默认情况下,这些容器支持以下身份验证类型:

    • 基本的
    • 摘要
    • 表格
    • 客户证书

    HTTP 基本身份验证

    指定 HTTP 基本身份验证要求服务器从 Web 客户端请求用户名和密码,并通过将用户名和密码与指定或默认领域中的授权用户数据库进行比较来验证用户名和密码是否有效。

    当您未指定身份验证机制时,默认为基本身份验证。

    使用基本身份验证时,会发生以下操作:

    1. 客户端请求访问受保护的资源。
    2. Web 服务器返回一个对话框,要求输入用户名和密码。
    3. 客户端向服务器提交用户名和密码。 4.\服务器在指定领域对用户进行身份验证,如果成功,则返回请求的资源。

    下图显示了当您指定 HTTP 基本身份验证时会发生什么。

    HTTP基本认证客户端与服务器之间HTTP基本认证的四个步骤图

    基于表单的身份验证

    基于表单的身份验证允许开发人员通过自定义 HTTP 浏览器呈现给最终用户的登录屏幕和错误页面来控制登录身份验证屏幕的外观。当声明基于表单的身份验证时,会发生以下操作。

    1. 客户端请求访问受保护的资源。
    2. 如果客户端未经身份验证,服务器会将客户端重定向到登录页面。
    3. 客户端向服务器提交登录表单。
    4. 服务器尝试对用户进行身份验证。
    5. 如果身份验证成功,则检查经过身份验证的用户的主体,以确保其处于有权访问资源的角色中。如果用户被授权,则服务器使用存储的 URL 路径将客户端重定向到资源。
    6. 如果身份验证失败,客户端会被转发或重定向到错误页面。

    下图显示了当您指定基于表单的身份验证时会发生什么。

    当您创建基于表单的登录时,请务必使用 cookie 或 SSL 会话信息来维护会话。

    为了正确进行身份验证,登录表单的操作必须始终为 j_security_check。进行此限制是为了使登录表单无论用于哪个资源都可以工作,并避免要求服务器指定出站表单的操作字段。以下代码 sn-p 显示了应如何将表单编码到 HTML 页面中:

    <form method="POST" action="j_security_check">
      <input type="text" name="j_username">
      <input type="password" name="j_password">
    </form>
    

    摘要式身份验证

    与基本身份验证一样,摘要身份验证基于用户名和密码对用户进行身份验证。但是,与基本身份验证不同,摘要身份验证不会通过网络发送用户密码。相反,客户端发送密码和附加数据的单向加密哈希。尽管密码不会在线发送,但摘要式身份验证要求身份验证容器可以使用明文密码等效项,以便它可以通过计算预期的摘要来验证接收到的身份验证器。

    参考资料:

    【讨论】:

      【解决方案2】:

      仅当数据库中不存在有关用户的数据时,才尝试转发到错误页面。 如果您发现您的用户使用以下代码将他重定向到他的“主页”页面

      RequestDispatcher dis = request.getRequestDispatcher("relativeURL2Jsp");
      dis.forward(request, response);
      

      【讨论】:

        【解决方案3】:

        尝试使用servlet过滤器,无需配置JAAS等人员

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多