使用Acegi保护Java应用程序,第2部分: 使用LDAP目录服务器2011-09-07 ibm Bilal Siddiqui使用 ApacheDS 和 Acegi 实现访问控制了解了 Acegi 安全系统(Acegi Security System)的 基础知识 后,我们 将介绍该系统的更加高级的应用。在本文中,Bilal Siddiqui 向您展示了如何 结合使用 Acegi 和一个 LDAP 目录服务器,实现灵活的具有高性能的 Java™ 应用程序的安全性。还将了解如何编写访问控制策略并将其存储在 ApacheDS 中,然后配置 Acegi 使其与目录服务器交互,从而实现身份验证和授 权的目的。这期共分三部分的系列文章介绍了如何使用 Acegi 安全系统保护 Java 企业 应用程序。在 本系列第一篇文章 中,我介绍了 Acegi 并解释了如何使用安全 过滤器实现一个简单的基于 URL 的安全系统。在第二篇文章中,我将讨论 Acegi 的更加高级的应用,首先我将编写一个访问控制策略并将其存储在 ApacheDS 中,ApacheDS 是一个开源的 LDAP 目录服务器。我还将展示配置 Acegi 的方法,使它能够与目录服务器交互并实现您的访问控制策略。本文的结 尾提供了一个示例应用程序,它使用 ApacheDS 和 Acegi 实现了一个安全的访 问控制策略。实现访问控制策略通常包含两个步骤:将有关用户 和用户角色的数据存储在目录服务器中。编写安全代码,它将定义有权 访问并使用数据的人员。Acegi 将减轻代码编写的工作,因此在这篇文 章中,我将展示如何将用户和用户角色信息存储到 ApacheDS 中,然后实现这些 信息的访问控制策略。在该系列的最后一篇文章中,我将展示如何配置 Acegi, 实现对 Java 类的安全访问。LDAP 基础知识轻量级目录访问协 议(Lightweight Directory Access Protocol,LDAP)可能是最流行的一种定 义数据格式的协议,它针对常见的目录操作,例如对存储在目录服务器中的信息 执行的读取、编辑、搜索和删除操作。本节将简要解释为什么目录服务器是属性 文件存储安全信息的首选,并展示如何在 LDAP 目录中组织和托管用户信息。为什么要使用目录服务器?本系列第一部分向您介绍了一种简单的方法,可以将用户信息以属性文件的 形式保存起来(参见 第 1 部分,清单 6)。属性文件以文本格式保存用户名、 密码和用户角色。对于大多数真实应用程序而言,使用属性文件存储安全信息远 远不够。各种各样的理由表明,目录服务器通常都是更好的选择。其中一个原因 是,真实的企业应用程序可以被大量用户访问 —— 通常是几千名用户,如果应 用程序将其部分功能公开给用户和供应商时更是如此。频繁搜索文本文件中随意 存储的信息,这样做的效率并不高,但是目录服务器对这类搜索进行了优化。第 1 部分的清单 6 中的属性文件演示了另一个原因,该文件组合了用户和 角色。在真实的访问控制应用程序中,您通常都需要分别定义和维护用户和角色 信息,这样做可以简化用户库的维护。目录服务器为更改或更新用户信息提供了 极大的灵活性,例如,反映职位升迁或新聘用人员。LDAP 目录设置如果希望将用户信息存储在一个 LDAP 目录中,您需要理解一些有关目录设 置的内容。本文并没有提供对 LDAP 的完整介绍,而是介绍了一些在尝试结合使 用 Acegi 和 LDAP 目录之前需要了解的基本概念。LDAP 目录以节点树的形式存储信息,如图 1 所示:图 1. LDAP 目录的树状结构

在图 1 中,根节点的名称为 org。根节点可以封装与不同企业有关的数据。 例如,本系列第 1 部分开发的制造业企业被显示为 org 节点的直接子节点。该 制造业企业具有两个名为 departments 和 partners 的子节点。partners 子节点封装了不同类型的合作伙伴。图 1 所示的三个分别为 customers、employees 和 suppliers。注意,这三种类型的合作伙伴其行为与 企业系统用户一样。每一种类型的用户所扮演的业务角色不同,因此访问系统的 权利也不同。类似地,departments 节点包含该制造业企业的不同部门的数据 —— 例如 engineering 和 marketing 字节点。每个部门节点还包含一组或多组用户。在 图 1 中,engineers 组是 engineering 部门的子节点。假设每个部门的子节点表示一组用户。因此,部门节点的子节点具有不同的 用户成员。例如,设计部门的所有工程师都是 engineering 部门内 engineers 组的成员。最后,注意 图 1 中 departments 节点的最后一个子节点。specialUser 是 一名用户,而非一组用户。在目录设置中,像 alice 和 bob 之类的用户一般都 包含在 partners 节点中。我将这个特殊用户包含在 departments 节点中,以 此证明 Acegi 允许用户位于 LADP 目录中任何地点的灵活性。稍后在本文中, 您将了解如何配置 Acegi 以应用 specialUser。