标准表单认证Java servlets

10

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

目前,我已经使用一个简单的POST HTML表单来实现它:

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

但是现在我遇到了如何在嵌入式Jetty中配置安全性,现在我正在考虑是否可以重用已经实现的解决方案,但在这里什么是标准方法?我自己使用Jetty,但Tomcat或其他Web服务器怎么样呢?

我还阅读了关于j_security_check的文章,那是什么?那是一种遗留的方法吗?

3个回答

14

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

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

  • BASIC
  • DIGEST
  • FORM
  • CLIENT-CERT

HTTP基本认证

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

当不指定身份验证机制时,基本身份验证是默认身份验证方法。

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

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

下图显示了指定HTTP基本认证时发生的情况。 enter image description here

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

基于表单的身份验证

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

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

下图显示了指定基于表单的身份验证时发生的情况。

enter image description here

创建基于表单的登录时,请确保使用cookie或SSL会话信息维护会话。

为了使身份验证适当进行,登录表单的操作必须始终为j_security_check。这是为了使登录表单在哪个资源上都能够工作,并避免要求服务器指定出站表单的操作字段。以下代码片段显示了应如何将表单编码到HTML页面中:

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

摘要认证

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

参考资料:


1

尝试使用Servlet过滤器,无需配置JAAS和其他工具


-1

如果数据库中没有关于用户的数据,请尝试转发到错误页面。 如果您找到了用户,请使用以下代码将其重定向到他的“主页”。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接