定制 Web 应用程序登录
可以创建表单登录页面和错误页面以便对用户进行认证。
开始之前
- HTTP 基本认证:Web 服务器要求 Web 客户机进行认证,并且 Web 客户机在 HTTP 头中传递用户标识和密码。
- HTTPS 客户机认证:此机制要求用户(Web 客户机)拥有公用密钥证书。Web 客户机将证书发送到请求客户机证书的 Web 服务器。此认证机制很强大,它使用超文本传输协议和安全套接字层 (HTTPS) 协议。
- 基于表单的认证:开发者使用此认证机制控制登录屏幕的外观。
超文本传输协议 (HTTP) 基本认证以简单基本 64 位编码从 Web 客户机将用户密码发送到 Web 服务器。基于表单的认证以明文将用户密码从浏览器发送到 Web 服务器。因此,除非使用 HTTPS 协议,否则 HTTP 基本认证和基于表单的认证都不是很安全。
Web 应用程序部署描述符包含有关使用哪个认证机制的信息。当使用基于表单的认证时,部署描述符还包含用于登录页面和错误页面的条目。登录页面可以是 HTML 页面或 JavaServer Pages (JSP) 文件。从应用程序访问受保护的资源(Servlet、JSP 文件、HTML 页面)时,此登录页面在 Web 客户机端上显示。认证失败时,将显示错误页面。可以写登录页面和错误页面,来满足应用程序的需要和控制这些页面的外观。应用程序组装期间,组装器可为应用程序设置认证机制,并在部署描述符中设置登录页面和错误页面。
- sendRedirect 方法最初在 Web 浏览器中显示表单登录。它后来重定向 Web 浏览器回到初始请求的受保护的页面。sendRedirect(String URL) 方法告知 Web 浏览器使用 HTTP GET 请求来获取在 Web 地址中指定的页面。如果 HTTP POST 是对受保护的 servlet 或 JavaServer Pages (JSP) 文件的第一个请求,且先前未发生认证或登录,那么不传递 HTTP POST 到请求的页面。但会传递 HTTP GET,这是因为表单登录使用 sendRedirect 方法,它起 HTTP GET 请求的作用,试图在发生登录后显示请求的页面。
- 使用 HTTP POST,您可能经历过未保护的 HTML 表单从用户收集数据然后将此数据发布给受保护的 servlet 或 JSP 文件进行处理,但用户没有登录该资源的情况。要避免这样的情况,结构化您的 Web 应用程序或许可权,以便在应用程序对受保护的 servlet 或 JSP 文件执行任何 HTTP POST 操作前,强制用户使用表单登录页面。
过程
示例:表单登录
- Java EE 基于表单的登录
- 用于登录的 Java EE servlet 过滤器
- IBM® 扩展:基于表单的登录
<form method="POST" action="j_security_check">
<input type="text" name="j_username">
<input type="text" name="j_password" autocomplete="off">
<\form>
使用 j_username 输入字段获取用户名,而使用 j_password 输入字段获取用户密码。
接收 Web 客户机的请求时,Web 服务器将已配置的表单页面发送到客户机并保存原始请求。当 Web 服务器从 Web 客户机接收已完成的表单页面时,它将从表单中抽取用户名和密码并对用户进行认证。成功认证时,Web 服务器重定向调用到原始请求。如果认证失败,那么 Web 服务器重定向调用到已配置错误页面。
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.0 Transitional//EN">
<html>
<META HTTP-EQUIV = "Pragma" CONTENT="no-cache">
<title> Security FVT Login Page </title>
<body>
<h2>Form Login</h2>
<FORM METHOD=POST ACTION="j_security_check">
<p>
<font size="2"> <strong> Enter user ID and password: </strong></font>
<BR>
<strong> User ID</strong> <input type="text" size="20" name="j_username">
<strong> Password </strong> <input type="password" size="20" name="j_password" autocomplete="off">
<BR>
<BR>
<font size="2"> <strong> And then click this button: </strong></font>
<input type="submit" name="login" value="Login">
</p>
</form>
</body>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.0 Transitional//EN">
<html>
<head><title>A Form login authentication failure occurred</head></title>
<body>
<H1><B>A Form login authentication failure occurred</H1></B>
<P>Authentication may fail for one of many reasons. Some possibilities include:
<OL>
<LI>The user-id or password may be entered incorrectly; either misspelled or the
wrong case was used.
<LI>The user-id or password does not exist, has expired, or has been disabled.
</OL>
</P>
</body>
</html>
<login-config id="LoginConfig_1">
<auth-method>FORM<auth-method>
<realm-name>Example Form-Based Authentication Area</realm-name>
<form-login-config id="FormLoginConfig_1">
<form-login-page>/login.html</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
META-INF
META-INF/MANIFEST.MF
login.html
error.jsp
WEB-INF/
WEB-INF/classes/
WEB-INF/classes/aServlet.class
表单注销是一种注销机制,无须关闭所有 Web 浏览器会话。退出表单注销机制后,对受保护的 Web 资源进行访问将需要重新认证。J2EE 规范不需要此功能,但该功能是作为 WebSphere Application Server 安全性中的附加功能提供的。
- 注销表单 URI 是在 Web 浏览器中指定的,并且会装入该表单。
- 用户在表单上单击提交以注销。
- WebSphere Application Server 安全性代码注销用户。在此过程中,应用程序服务器会完成以下过程:
- 清除轻量级第三方认证 (LTPA)/单点登录 (SSO) cookie
- 使 HTTP 会话失效
- 从认证高速缓存中移除用户
- 注销后,用户被重定向到注销退出页面。
表单注销不需要部署描述符中的任何属性。表单注销页面是随 Web 应用程序提供的 HTML 或 JavaServer Pages (JSP) 文件。表单注销页面同大多数 HTML 表单(表单登录页面除外)一样,它具有一个特殊公布操作。此公布操作由 Web 容器识别,它将公布操作分派给一个特殊的内部表单注销 servlet。表单注销页面中的公布操作必须是 ibm_security_logout。
可在注销表单中指定注销退出页面,而退出页面可以表示注销后用户重定向到的同一 Web 应用程序中的 HTML 或 JSP 文件。此外,注销退出页面允许 http://hostname:port/URL 格式的标准 URL。注销退出页面是作为表单注销页面中的参数指定的。如果未指定注销退出页面,那么将返回缺省注销 HTML 消息给用户。
<!DOCTYPE HTML PUBliC "-//W3C/DTD HTML 4.0 Transitional//EN">
<html>
<META HTTP-EQUIV = "Pragma" CONTENT="no-cache">
<title>Logout Page </title>
<body>
<h2>Sample Form Logout</h2>
<FORM METHOD=POST ACTION="ibm_security_logout" NAME="logout">
<p>
<BR>
<BR>
<font size="2"><strong> Click this button to log out: </strong></font>
<input type="submit" name="logout" value="Logout">
<INPUT TYPE="HIDDEN" name="logoutExitPage" VALUE="/login.html">
</p>
</form>
</body>
</html>