使用基本身份验证时,Web 浏览器会弹出一个登录屏幕来响应 WebLogic 资源请求。登录屏幕提示用户输入用户名和密码。图 3-2 给出了一个典型的登录屏幕。
要开发提供基本身份验证的 Web 应用程序,请执行下列步骤:
创建web.xml
部署描述符。请在该文件中包括以下信息(请参阅清单 3-1):定义欢迎文件。欢迎文件的名称为welcome.jsp
。为计划要保护的每组 Web 应用程序资源(即 URL 资源)定义安全约束。每组资源共享一个通用的 URL。通常,HTML 页、JSP 和 Servlet 等 URL 资源受最大的保护,但其他类型的 URL 资源也受支持。在清单 3-1 中,URL 模式指向位于 Web 应用程序的顶级目录中的welcome.jsp
文件;可以访问 URL 资源的 HTTP 方法(POST 和 GET);以及安全角色名webuser
。注意: 指定安全角色名称时,请遵循以下约定和限制: 安全角色名称的正确语法与可扩展标记语言 (XML) 建议中对Nmtoken
定义的语法(可从 Web 上获取,网址为 http://www.w3.org/TR/REC-xml#NT-Nmtoken)相同。不要使用空格、逗号、连字符或以下逗号分隔列表中的任何字符:/t、< >、#、|、&、~、?、( )、{ }。安全角色名区分大小写。BEA 建议对安全角色名使用以下约定:它们应该独一无二。
使用 <login-config> 标记定义要使用的身份验证类型以及将应用安全约束的安全领域。在清单 3-1 中指定了 BASIC 类型,并且领域是默认领域,这意味着,当 WebLogic Server 实例启动时,安全约束将应用到活动安全领域。定义一个或多个安全角色并将它们映射到安全约束。在我们的示例中,只在安全约束中定义了一个安全角色webuser
,因此,因此在此处只定义一个安全角色名称(请参阅清单 3-1 中的 <security-role> 标记)。但是,实际上可以定义任意数量的安全角色。<?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>Success</web-resource-name>
<url-pattern>/welcome.jsp</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>webuser</role-name>
</auth-constraint>
</security-constraint><login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config><security-role>
<role-name>webuser</role-name>
</security-role>
</web-app>
创建weblogic.xml
部署描述符。在该文件中,将安全角色名称映射到用户和组。清单 3-2 给出了一个示例weblogic.xml
文件,该文件将在web.xml
文件的 <security-role> 标记中定义的webuser
安全角色映射到一个名为myGroup
的组。请注意,委托人可以是用户,也可以是组,因此<principal-tag>
可用于用户,也可以用于组。使用此配置时,WebLogic Server 只允许myGroup
中的用户访问受保护的 URL 资源welcome.jsp
。注意: 从 9.0 版开始,默认角色映射行为是指在未在 weblogic.xml
中指定角色映射时创建空角色映射。在 8.x 版中,如果未包括weblogic.xml
文件,或包括了该文件但未包括所有安全角色的映射,则没有映射的安全角色默认为其名称与角色名匹配的任何用户或组。有关角色映射行为和向后兼容性设置的信息,请参阅“使用角色和策略确保 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>webuser</role-name>
<principal-name>myGroup</principal-name>
</security-role-assignment></weblogic-web-app>
创建一个文件,该文件在用户输入用户名和密码并获得访问权限时将生成欢迎屏幕。清单 3-3 显示了一个示例welcome.jsp
文件。图 3-3 显示了欢迎屏幕。<html>
<head>
<title>Browser Based Authentication Example Welcome Page</title>
</head>
<h1> Browser Based Authentication Example Welcome Page </h1><p> Welcome <%= request.getRemoteUser() %>!
</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-2)中,<principal-name> 标记将myGroup
定义为有权访问welcome.jsp
的组。因此,请使用管理控制台定义myGroup
组,再定义一名用户,然后将该用户添加到myGroup
组中。有关添加用户和组的信息,请参阅“使用角色和策略确保 WebLogic 资源安全”中的用户、组和安全角色。部署 Web 应用程序并使用在上一步中定义的用户访问受保护的 URL 资源。有关部署说明,请参阅部署 Web 应用程序。打开 Web 浏览器并输入以下 URL:输入用户名和密码。即显示欢迎屏幕。
使用 HttpSessionListener 补偿“浏览器缓存凭据”
浏览器会缓存用户凭据并经常自动将它们重新发送到服务器。这样,即使退出或超时,WebLogic Server 会话也不会受到破坏。可以只缓存当前浏览器会话的凭据,也可以缓存多个浏览器会话的凭据,具体取决于浏览器。
可以通过创建实现 javax.servlet.http.HttpSessionListener
接口的类来验证 WebLogic Server 的会话是否受到了破坏。如果 Web 应用程序中的活动会话列表发生改变,则会通知该接口的实现。要接收通知事件,必须在 web.xml
中的 Web 应用程序部署描述符中配置实现类。
打开 Web 应用程序的web.xml
部署描述符,您将在文本编辑器中为该描述符创建会话监听器类。web.xml
文件位于 Web 应用程序的 WEB-INF 目录中。添加使用 web.xml 部署描述符的监听器元素的事件声明。事件声明可定义当事件发生时要调用的事件监听器类。例如:
有关其他信息和依次准则,请参阅 配置事件监听器类。
<listener>
<listener-class>myApp.MySessionListener</listener-class>
</listener>
编写并部署会话监听器类。清单 3-4 中显示的示例使用简单计数器跟踪会话计数。
package myApp;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;
public class MySessionListener implements HttpSessionListener {
private static int sessionCount = 0;
public void sessionCreated(HttpSessionEvent se) {
sessionCount++;
//写入日志或执行其他处理。
public void sessionDestroyed(HttpSessionEvent se) {
if(sessionCount > 0)
sessionCount--;
//写入日志或执行其他处理。
}