将 FORM 身份验证用于 Web 应用程序时,将提供一个自定义登录屏幕(Web 浏览器在响应 Web 应用程序资源请求时显示)和一个错误屏幕(在登录失败时显示)。可以使用 HTML 页、JSP 或 Servlet 生成登录屏幕。基于表单登录的优点是:可以完全控制这些屏幕,因此可以将它们设计得满足应用程序或企业策略/准则的要求。
登录屏幕提示用户输入用户名和密码。图 3-4 所示为使用 JSP 生成的典型登录屏幕,而清单 3-5 所示则为源代码。
<html>
<head>)
<title>Security WebApp login page</title>
</head>
<body bgcolor="#cccccc">
<blockquote>
<img src=BEA_Button_Final_web.gif align=right>
<h2>Please enter your user name and password:</h2>
<p>
<form method="POST" action="j_security_check">
<table border=1>
<tr>
<td>Username:</td>
<td><input type="text" name="j_username"></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="j_password"></td>
</tr>
<tr>
<td colspan=2 align=right><input type=submit
value="Submit"></td>
</tr>
</table>
</form>
</blockquote>
</body>
</html>
图 3-5 所示为使用 HTML 生成的典型登录错误屏幕,而清单 3-6 所示则为源代码。
<html>
<head>
<title>Login failed</title>
</head>
<body bgcolor=#ffffff>
<blockquote>
<img src=/security/BEA_Button_Final_web.gif align=right>
<h2>Sorry, your user name and password were not recognized.</h2>
<p><b>
<a href="/security/welcome.jsp">Return to welcome page</a> or
<a href="/security/logout.jsp">logout</a>
</b>
</blockquote>
</body>
</html>
要开发提供 FORM 身份验证的 Web 应用程序,请执行下列步骤:
创建web.xml
部署描述符。请在该文件中包括以下信息(请参阅清单 3-7):定义欢迎文件。欢迎文件的名称为welcome.jsp
。为计划要保护的每组 URL 资源定义安全约束。每组 URL 资源共享一个通用的 URL。通常,HTML 页、JSP 和 Servlet 等 URL 资源受最大的保护,但其他类型的 URL 资源也受支持。在清单 3-7 中,URL 模式指向 /admin/edit.jsp,从而保护位于 Web 应用程序的admin
子目录中的edit.jsp
文件;定义可以访问 URL 资源的 HTTP 方法 (GET
);并定义安全角色名admin
。注意: 安全角色名称中不能包含连字符。在管理控制台中,无法修改含连字符的安全角色名称。另外,BEA 建议对安全角色名使用以下约定:它们应该独一无二。 定义要使用的身份验证类型以及将应用安全约束的安全领域。在本例中,指定了FORM
类型,但未指定领域,因此,领域是默认领域,这意味着安全约束将应用到 WebLogic Server 实例启动时激活的安全领域。定义一个或多个安全角色并将它们映射到安全约束。在我们的示例中,只在安全约束中定义了一个安全角色admin
,因此在此处只定义一个安全角色名称。但是,实际上可以定义任意数量的安全角色。<?xml version='1.0' encoding='UTF-8'?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><web-app>
<welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
</welcome-file-list><security-constraint>
<web-resource-collection>
<web-resource-name>AdminPages</web-resource-name>
<description>
These pages are only accessible by authorized
administrators.
</description>
<url-pattern>/admin/edit.jsp</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<description>
These are the roles who have access.
</description>
<role-name>
admin
</role-name>
</auth-constraint>
<user-data-constraint>
<description>
This is how the user data must be transmitted.
</description>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint><login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/fail_login.html</form-error-page>
</form-login-config>
</login-config><security-role>
<description>
An administrator
</description>
<role-name>
admin
</role-name>
</security-role>
</web-app>
创建weblogic.xml
部署描述符。在该文件中,将安全角色名称映射到用户和组。清单 3-8 给出了一个示例weblogic.xml
文件,该文件将在web.xml
文件的 <security-role> 标记中定义的admin
安全角色映射到一个名为supportGroup
的组。使用此配置时,WebLogic Server 将只允许supportGroup
组中的用户访问受保护的 WebLogic 资源。但是,可以使用管理控制台来修改 Web 应用程序的安全角色,以便其他组可以访问受保护的 WebLogic 资源。<?xml version='1.0' encoding='UTF-8'?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><weblogic-web-app>
<security-role-assignment>
<role-name>admin</role-name>
<principal-name>supportGroup</principal-name>
</security-role-assignment></weblogic-web-app>
创建一个 Web 应用程序文件,该文件在用户通过输入 URL 请求受保护的 Web 应用程序资源时将生成欢迎屏幕。清单 3-9 显示了一个示例welcome.jsp
文件。图 3-3 显示的是欢迎屏幕。<html>
<head>
<title>Security login example</title>
</head><%
String bgcolor;
if ((bgcolor=(String)application.getAttribute("Background")) ==
null)
{
bgcolor="#cccccc";
}
%><body bgcolor=<%="/""+bgcolor+"/""%>>
<blockquote>
<img src=BEA_Button_Final_web.gif align=right>
<h1> Security Login Example </h1><p> Welcome <%= request.getRemoteUser() %>!
<p> If you are an administrator, you can configure the background
color of the Web Application.
<br> <b><a href="admin/edit.jsp">Configure background</a></b>.<% if (request.getRemoteUser() != null) { %>
<p> Click here to <a href="logout.jsp">logout</a>.
<% } %></blockquote>
</body>
</html>
注意: | 在清单 3-3 中,请注意,JSP 将调用一个 API (request.getRemoteUser() ) 来获取登录用户的用户名。可改用不同的 API weblogic.security.Security.getCurrentSubject() 。要使用该 API 获取用户的名称,请将它与 SubjectUtils API 结合使用,如下所示: |
String username = weblogic.security.SubjectUtils.getUsername(
weblogic.security.Security.getCurrentSubject());
启动 WebLogic Server,然后定义有权访问 URL 资源的用户和组。在weblogic.xml
文件(请参阅清单 3-8)中,<role-name> 标记将admin
定义为有权访问edit.jsp
文件的组,并将用户joe
定义为该组的成员。因此,请使用管理控制台定义admin
组,定义用户joe
,并将joe
添加到admin
组中。也可以定义其他用户并将其添加到组中,这些用户也将有权访问受保护的 WebLogic 资源。有关添加用户和组的信息,请参阅“使用角色和策略确保 WebLogic 资源安全”中的用户、组和安全角色。部署 Web 应用程序并使用在上一步中定义的用户访问受保护的 Web 应用程序资源。有关部署说明,请参阅部署 Web 应用程序。打开 Web 浏览器并输入以下 URL:输入用户名和密码。即显示欢迎屏幕。