将 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>
注意:
action="j_security_check"
name="j_username"name="j_password"
为约定写法,必须这样写
<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:输入用户名和密码。即显示欢迎屏幕。