开发 BASIC 身份验证 Web 应用程序

来源:互联网 发布:买家怎么用淘宝客 编辑:程序博客网 时间:2024/05/16 13:38

 

使用基本身份验证时,Web 浏览器会弹出一个登录屏幕来响应 WebLogic 资源请求。登录屏幕提示用户输入用户名和密码。图 3-2 给出了一个典型的登录屏幕。

图 3-2 身份验证登录屏幕

身份验证登录屏幕

 

要开发提供基本身份验证的 Web 应用程序,请执行下列步骤:

  1. 创建 web.xml 部署描述符。请在该文件中包括以下信息(请参阅清单 3-1):
    1. 定义欢迎文件。欢迎文件的名称为 welcome.jsp
    2. 为计划要保护的每组 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 建议对安全角色名使用以下约定:它们应该独一无二。
    3. 使用 <login-config> 标记定义要使用的身份验证类型以及将应用安全约束的安全领域。在清单 3-1 中指定了 BASIC 类型,并且领域是默认领域,这意味着,当 WebLogic Server 实例启动时,安全约束将应用到活动安全领域。
    4. 定义一个或多个安全角色并将它们映射到安全约束。在我们的示例中,只在安全约束中定义了一个安全角色 webuser,因此,因此在此处只定义一个安全角色名称(请参阅清单 3-1 中的 <security-role> 标记)。但是,实际上可以定义任意数量的安全角色。
      清单 3-1 基本身份验证 web.xml 文件
      <?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>
  2. 创建 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 资源安全”手册中的了解“已启用组合角色映射”设置部分
    清单 3-2 基本身份验证 weblogic.xml 文件
    <?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-3 显示了一个示例 welcome.jsp 文件。图 3-3 显示了欢迎屏幕。
    清单 3-3 基本身份验证 welcome.jsp 文件
    <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());
图 3-3 欢迎屏幕


欢迎屏幕

  1. 启动 WebLogic Server,然后定义有权访问 URL 资源的用户和组。在 weblogic.xml 文件(请参阅清单 3-2)中,<principal-name> 标记将 myGroup 定义为有权访问 welcome.jsp 的组。因此,请使用管理控制台定义 myGroup 组,再定义一名用户,然后将该用户添加到 myGroup 组中。有关添加用户和组的信息,请参阅“使用角色和策略确保 WebLogic 资源安全”中的用户、组和安全角色
  2. 部署 Web 应用程序并使用在上一步中定义的用户访问受保护的 URL 资源。
    1. 有关部署说明,请参阅部署 Web 应用程序
    2. 打开 Web 浏览器并输入以下 URL:

      http://localhost:7001/basicauth/welcome.jsp

    3. 输入用户名和密码。即显示欢迎屏幕。

使用 HttpSessionListener 补偿“浏览器缓存凭据”

浏览器会缓存用户凭据并经常自动将它们重新发送到服务器。这样,即使退出或超时,WebLogic Server 会话也不会受到破坏。可以只缓存当前浏览器会话的凭据,也可以缓存多个浏览器会话的凭据,具体取决于浏览器。

可以通过创建实现 javax.servlet.http.HttpSessionListener 接口的类来验证 WebLogic Server 的会话是否受到了破坏。如果 Web 应用程序中的活动会话列表发生改变,则会通知该接口的实现。要接收通知事件,必须在 web.xml 中的 Web 应用程序部署描述符中配置实现类。

要配置会话监听器类,请执行下列操作:

  1. 打开 Web 应用程序的 web.xml 部署描述符,您将在文本编辑器中为该描述符创建会话监听器类。web.xml 文件位于 Web 应用程序的 WEB-INF 目录中。
  2. 添加使用 web.xml 部署描述符的监听器元素的事件声明。事件声明可定义当事件发生时要调用的事件监听器类。例如:

    <listener>
    <listener-class>myApp.MySessionListener</listener-class>
    </listener>

    有关其他信息和依次准则,请参阅 配置事件监听器类

编写并部署会话监听器类。清单 3-4 中显示的示例使用简单计数器跟踪会话计数。

清单 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--;
//写入日志或执行其他处理。