`
stupen
  • 浏览: 13357 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

有关LDAP协议的整理

阅读更多

 

    LDAP的英文全称是Lightweight Directory Access Protocol,即轻量级目录访问协议.我们
知道,人们对计算机网络的使用和管理涉及了各种庞杂的资源,信息.为了提高性能,便于使
用,有效管理分布式应用的服务,资源,用户及别的对象信息,这些信息需要清晰,一致地组
织起来.基于这样的需求,描述各种用户,应用,文件,打印机和其它可从网络访问的资源的
信息被集中到一个特殊的数据库中,这种数据库被称为目录.目录存放对象的公开或非公开的
信息,这些信息以某种顺序组织,描述了每个对象的细节.电话簿,图书馆藏书卡片目录就是
常见的目录.
     LDAP是基于X.500标准的,访问 X.500 目录需要某种协议,例如:目录访问协议 (DAP).
然而,DAP 需要大量的系统资源和支持机制来处理复杂的协议.LDAP 仅通过使用原始 X.500
目录存取协议 (DAP) 的功能子集而减少了所需的系统资源消耗,而且可以根据需要定制.此
外,与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的.
    为了能对LDAP协议进行更好的理解,我们需要对以下概念有初步的认识:
目录:Directory,存放对象的信息,这些信息以某种顺序组织,详细描述每个对象.
目录信息树:DIT,Directory Information Tree,目录条目的集合构成了目录信息树.
条目:Entry,目录信息树中的一个结点,是一个对象信息的集合,是目录信息中最基本的
单位,包含该对象的一系列属性.
属性:Attribute,属性描述对象的特征.一个属性由属性类型(type)和一个或多个属性值
(values)构成.
相对标识名:RDN,Relative Distinguished Name,条目的名字.
唯一标识名:DN,Distinguished Name,在一个目录信息树中唯一标识一个条目的名字.
    LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。
目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描
述性的,基于属性的信息并支持精细复杂的过滤能力。目录一般不支持通用数据库针对大量更新操作操作需要的
复杂的事务管理或回卷策略。而目录服务的更新则一般都非常简单。这种目录可以存储包括个人信息、web链结、
jpeg图像等各种信息。为了访问存储在目录中的信息,就需要使用运行在TCP/IP之上的访问协议—LDAP。

    LDAP目录中的信息是是按照树型结构组织,具体信息存储在条目(entry)的数据结构中。条目相当于关系数据库中
表的记录;条目是具有区别名DN(Distinguished Name)的属性(Attribute),DN是用来引用条目的,DN相当于
关系数据库表中的关键字(Primary Key)。属性由类型(Type)和一个或多个值(Values)组成,相当于关系数
据库中的字段(Field)由字段名和数据类型组成,只是为了方便检索的需要,LDAP中的Type可以有多个Value,
而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。LDAP中条目的组织一般按照地理位置
和组织关系进行组织,非常的直观。LDAP把数据存放在文件中,为提高效率可以使用基于索引的文件数据库,而不
是关系数据库。类型的一个例子就是mail,其值将是一个电子邮件地址。

WebLogic的内置的LDAP Server支持IETF LDAP为LDAPv3制定的控制访问模型。下面这个片断将讲述在内置的LDAP
Server中怎样实现控制访问。可以通过编辑访问控制文件来将这些规则直接应用到目录的入口。
WebLogic中的访问控制文件是acls.prop。在Server的lib中可以找到这个文件。
这个文件的所有访问控制规则都被注释掉了,如果想更改这些规则,你要手工更改这个文件。
注意:WebLogic Server内置的LDAP Server在默认的情况下只允许Admin帐号访问,WebLogic Server的security providers
只使用Admin帐号访问内置的LDAP Server。如果你不想使用外部的LDAP Brower访问WebLogic Server的内置的LDAP Server,
或者你只想使用Admin帐号访问内置的LDAP Server,你不需要编辑acls.prop文件,
访问控制文件(The Access Control File)

访问控制文件(acls.prop)包含内置的LDAP Server的整个目录的完整的访问控制列表(ACL)。
这个文件中的每一行都包含一个访问控制规则。一个访问控制规则由下面接个部分组成:
    访问控制位置(Access Control Location)
       每个访问控制规则都应用于LDAP目录中的一个给定的位置。这个位置通常是一个区别命名(DN),但有一个例外,这就是[root],如果访问控制规则应用到整个目录,则只需要指定位置为[root]就可以了!
       如果被访问或更改的入口的位置与访问控制规则指定的位置不相等,或在访问控制规则指定的位置的下级,则这个访问控制规则将不会被执行。

   访问控制范围(Access Control Scope)
       访问控制范围有2种:
       Entry-一个Entry范围的访问控制列表只在下面的情况下被执行:
       LDAP目录的入口的DN与访问控制规则指定的位置相同。这样的规则对于包含了比并行和副入口更敏感信息的单独入口非常有用。
       Subtree-意味着访问控制规则指定的位置及子树都可以适用这条规则。
        如果Entry与Subtree在访问控制规则中有冲突,则Entry要优先于Subtree。

   访问权限(Access Rights)
        访问权限应用于整个对象或对象的属性,有2个值:grant(准许)或deny(拒绝)。访问权限指定了LDAP操作的类型。
  
   许可(grant或deny)

   应用规则的属性(attribute)

   允许或拒绝访问的主题(subject)
   在weblogic可以编写程序来访问LDAP.上手时可以选择JXplorer工具。
   1.LDAP Server及LDAP Browser:
      对于WLS LDAP为理解起来简单,去掉限制的方法是修改bea\weblogic81\server\lib\acls.prop文件后。修改方法:
在该文件最后添加以下几行。
[root]|entry#grant:s,r,o,w,c,m#[all]#public
[root]|subtree#grant:s,r,o,w,c,m#[all]#public:
[root]|subtree#grant:a,d,e,i,n,b,t#[entry]#public:
cn=schema|entry#grant:s,r,o,w,c,m#[all]#public:
cn=schema|entry#grant:a,d,e,i,n,b,t#[entry]#public:
注意,该文件中这些行之间,以及其他行之间不能有空行,否则启动WLS会报错的。修改好之后就可以启动WLS了,
启动后进入Console里修改Ldap Server的密码。密码修改完后需要再重新启动一次WLS。
LDAP刚上手的时候没有方便的工具会很费劲。我看了CSDN上“兔八哥”的文章,用JXplorer,感觉很不错。
想看这篇文章,到CSDN上搜一下“兔八哥”,系列中No.12就是关于JXplorer的配置和使用。我的连接参数如下:
Host:localhost//根据实际修改
Port:7001
Protocol:LDAP v3
Base DN:dc=ldapdomain//根据实际修改
Level:User+Password
User DN:cn=Admin
Password:weblogic//根据实际修改
.编程操作LDAP Server。
 下面四个JAVA方法,分别用于初始化,查询,添加,删除,修改,关闭连接。
 记得每次都需要先大概连接,操作,然后关闭连接。和使用数据库差不多。
 
       首先是需要用到的头文件:
import java.util.Hashtable;
import java.util.Enumeration;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls ;
import javax.naming.NamingEnumeration;
import javax.naming.directory.SearchResult;
import javax.naming.directory.Attributes ;
import javax.naming.directory.Attribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.ModificationItem;
import java.lang.reflect.Method;
import java.io.BufferedReader;
import java.io.InputStreamReader;

 
然后是一个类域,用于保存上下文:
 
DirContext ctx = null;
 
然后是初始化:
 
    public void init(){
        String account="Admin";//操作LDAP的帐户。默认就是Admin。
        String password="weblogic";//帐户Admin的密码。
        String root="dc=ldapdomain"; //所操作的WLS域。也就是LDAP的根节点的DC
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");//必须这样写,无论用什么LDAP服务器。
        env.put(Context.PROVIDER_URL, "ldap://localhost:7001/" + root);//LDAP服务器的地址:端口。对WLS端口就是7001
        env.put(Context.SECURITY_AUTHENTICATION, "none");//授权界别,可以有三种授权级别,但是如果设为另外两种都无法登录,我也不知道为啥,但是只能设成这个值"none"。
        env.put(Context.SECURITY_PRINCIPAL, "cn=" + account + "," + root);//载入登陆帐户和登录密码
        env.put(Context.SECURITY_CREDENTIALS, password);
        try{
            ctx = new InitialDirContext(env);//初始化上下文
            System.out.println("认证成功");//这里可以改成异常抛出。
        }catch(javax.naming.AuthenticationException e){
            System.out.println("认证失败");
        }catch(Exception e){
            System.out.println("认证出错:"+e);
        }
 }

 
查询操作:
 
 public void search(){//我只能按照某些属性查找节点,偶还不会怎么查找一个目录或按照更复杂的正则式查找特定节点/目录
  try{
   SearchControls constraints = new SearchControls();
   constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
   System.out.print("what would you want to search:");
   BufferedReader bd=new BufferedReader(new InputStreamReader(System.in));
   String s=bd.readLine();
   NamingEnumeration en = ctx.search("", "uid="+s, constraints); //要查询的UID。如果是*则可以查到所有UID的节点
   if(en == null){
    System.out.println("Have no NamingEnumeration.");
   }
   if(!en.hasMoreElements()){
    System.out.println("Have no element.");
   }
   while (en != null && en.hasMoreElements()){//可以查出多个元素
       Object obj = en.nextElement();
       if(obj instanceof SearchResult){
           SearchResult si = (SearchResult) obj;
           System.out.println("\tname: " + si.getName());
           Attributes attrs = si.getAttributes();
           if (attrs == null){
               System.out.println("\tNo attributes");
           }else{
               for (NamingEnumeration ae = attrs.getAll(); ae.hasMoreElements();){//获得该节点的所有属性
       Attribute attr = (Attribute) ae.next();//下一属性
       String attrId = attr.getID();//获得该属性的属性名
       for (Enumeration vals = attr.getAll();vals.hasMoreElements();){//获得一个属性中的所有属性值
           System.out.print("\t\t"+attrId + ": ");
           Object o = vals.nextElement();//下一属性值
           if(o instanceof byte[])
               System.out.println(new String((byte[])o));
           else
               System.out.println(o);
       }
               }
           }
       }
       else{
           System.out.println(obj);
       }
       System.out.println();
   }
  }catch(Exception e){
   System.out.println("Exception in search():"+e);
  }
    }
 
添加操作:
 
    public void add(){
     try{
   String newUserName = "stella";
   BasicAttributes attrs = new BasicAttributes();
   BasicAttribute objclassSet = new BasicAttribute("objectclass");
   objclassSet.add("person");
   objclassSet.add("top");
   objclassSet.add("organizationalPerson");
   objclassSet.add("inetOrgPerson");
   objclassSet.add("wlsUser");
   attrs.put(objclassSet);
   attrs.put("sn", newUserName);
   attrs.put("uid", newUserName);
   attrs.put("cn", newUserName);
   ctx.createSubcontext("uid=" + newUserName+",ou=people,ou=myrealm", attrs);  //添加一个节点,我还不会添加目录
  }catch(Exception e){
   System.out.println("Exception in add():"+e);
  }
    }

 
修改操作:
 
    public void edit(){
     try{
   String account = "stella";//修改以前旧的值
   String sn = "stella sn";//修改以后新的值
   ModificationItem modificationItem[] = new ModificationItem[1];
   modificationItem[0] =
    new ModificationItem(
     DirContext.REPLACE_ATTRIBUTE,
     new BasicAttribute("sn", sn));//所修改的属性
   ctx.modifyAttributes("uid=" + account, modificationItem);    //执行修改操作
  }catch(Exception e){
   System.out.println("Exception in edit():"+e);
  }
    }

 
删除节点操作:
 
    public void delete(){
     try{
   String uid = "stella";
   ctx.destroySubcontext("uid=" + uid);  //按照UID删除某个节点。我还不会删除一个目录。
   }catch(Exception e){
    System.out.println("Exception in edit():"+e);
   }
    }

 
关闭连接:
 
    public void close(){
        if(ctx != null)
        {
            try
            {
                ctx.close();
            }
            catch (NamingException e)
            {
                System.out.println("NamingException in close():"+e);
            }
        }   
    }
我对LDAP的理解:它是用于对资源的管理和服务的访问协议,在Weblogic平台上的JNDI(包含EJB和DataSource)都是提供它来提供的。
正是JNDI的服务和RMI结合就形成J2EE平台上分布式的应用,因此说到底层,还是LDAP协议的支持。

部分资料参考:http://www.blogjava.net/kapok/archive/2005/05/05/4034.html

分享到:
评论

相关推荐

    svn安装配置与ldap整合

    这是一遍比较完整的linux下svn+apche+ldap安装配置手册,根据本人实际安装整理后的文档,目前都算是最新版本。其中ldap使用sun的opends,个人感觉比openldap要方便,当然重点不是用什么ldap而是如何配置。 主要包括...

    ldap-collate:整理和计数ldap条目-开源

    标题 "ldap-collate" 提供的信息表明,这是一个与LDAP(轻量级目录访问协议)相关的工具,主要用于整理和计数LDAP目录中的条目。它允许用户基于特定属性对条目进行搜索、分组和计数,从而提供了一个便捷的方式来管理...

    基于钉钉、企业微信通讯录的虚拟LDAP服务设计源码

    LDAP(轻量级目录访问协议)是一种开放的协议,主要用于查询和访问目录服务,尤其适用于存储组织、用户、设备等信息的场景。在本项目中,虚拟LDAP服务的构建,意味着企业用户无需部署传统的LDAP服务器,即可享受LDAP...

    OpenLDAPforLinux[归纳].pdf

    在Red Hat 5.3这样的Linux发行版上,可以通过包管理器(如yum)来安装OpenLDAP服务器,包括 slapd(服务器)、ldap-utils(命令行工具)和其他相关依赖库。 **2.2 测试安装正确性** 安装完成后,可以通过`slaptest`...

    Oracle9i基础资料整理

    Oracle9i基础资料整理是一份综合性的学习资源,涵盖了Oracle数据库的基础知识、日常维护、游标的使用、LDAP(轻量级目录访问协议)配置以及Oracle与SAP的对比分析。以下是对这些知识点的详细说明: 1. **Oracle基础...

    Security+知识点整理.pdf

    X.500是一个全球分布式目录服务的协议,而LDAP(Lightweight Directory Access Protocol)是X.500的一个简化版本,通常使用TCP端口389。LDAP支持动态WEP密钥和相互认证,可以通过SSL/TLS加密,形成LDAPS,其默认端口...

    全新账号整理

    这可能包括使用编程语言(如Python、Perl或bash)编写脚本来批量处理用户账户数据,或者定制现有的开源工具(如Apache LDAP、FreeIPA或Active Directory)以适应特定的账号管理需求。 “工具”标签则可能意味着...

    EMC VNX存储产品资料2013年12月整理(全系列).docx

    包括Windows Server 2003的基于访问权限的枚举(ABE)、地址解析协议(ARP)、自动化卷管理(AVM)、故障保护网络、NT LAN Manager(NTLM)身份验证、Kerberos认证、Lightweight Directory Access Protocol(LDAP)...

    ORACLE 网络 整理的资料

    本资料集主要关注Oracle网络的相关知识,对于学习和使用Oracle的爱好者来说,理解并掌握这些内容至关重要。 一、Oracle网络架构 Oracle网络架构由多个组件构成,包括Net Services(网络服务)、SQL*Net、TNS...

    cas单点登录汇总整理.rar

    这通常涉及在服务端代码中添加 CAS 相关配置,如 URL 地址、服务标识等。 3. 配置服务定义:在 CAS 服务器上定义服务,包括服务的唯一标识和服务的回调URL。 4. 用户认证:可以自定义认证机制,例如使用 LDAP、JDBC ...

    2020年网络与分布计算期末考试复习要点整理.docx

    LDAP是一种轻量级的目录访问协议,用于存储和检索目录信息。目录服务模型包括目录信息树(DIT),每个节点代表一个目录项,包含对象及其属性。目录服务组件包括目录信息库(DIB)和目录系统代理(DSA),用户通过...

    Libcurl中文教程[整理].pdf

    Libcurl是一款功能强大且广泛使用的C语言库,用于处理HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、TELNET、DICT、FILE和LDAP等多种协议的网络数据传输。Libcurl提供了一个灵活和可扩展的框架,允许开发者根据需要进行...

    信息化标准建设整理稿.docx

    - IP网标准:包括TCP/IP协议栈,如Ethernet、FR、ATM、PPP/SDH等,定义网络层和接入层的标准。 这些标准体系为信息化建设提供了全面的指导,确保了信息系统的稳定、高效和安全运行,促进了信息资源的有效利用和...

    iPlanet Directory Server整理mht学习资料.zip

    它可能会涵盖服务器如何作为轻量级目录访问协议(LDAP)服务器工作,以及它在企业网络中的角色。 2. **第 2 章 - 创建目录项**: 创建目录项是管理员的常见任务,这一章会讲解如何在目录服务器中添加、修改和删除...

    linux系统安装subversion服务器与配置整理.pdf

    **概述**\n - **SVN简介**:Subversion是自由开源的版本控制系统,支持通过Apache Http Server运行,利用WebDAV协议,便于使用浏览器浏览源代码库,并可集成SSPI和LDAP认证,提供高级安全特性。\n\n3. **安装步骤**...

    Killtest 分享156-215.1 题库

    根据给定的信息,我们可以提取...以上内容基于提供的部分材料进行了整理和扩展,涵盖了多播传输、LDAP查找处理、Web服务器监控以及日志文件管理等方面的知识点。这些内容对于准备156-215.1考试的人来说是非常有价值的。

    Openfiler中文详细操作手册

    ### Openfiler中文详细操作手册...以上是根据《Openfiler中文详细操作手册》的相关内容整理的知识点概述。这些知识点覆盖了从安装配置到具体功能设置的各个方面,对于理解Openfiler的工作原理及实际操作非常有帮助。

    IBM+MQ使用方法整理打包

    可以通过SSL/TLS协议保护消息传输的安全性,同时可以集成企业现有的安全框架,如Kerberos或LDAP。 6. **监控与管理**:IBM MQ提供了丰富的管理工具,如MQ Explorer和Command Line Processor(mqsc),用于查看队列...

    计算机软件-商业源码-275 获取网络中所有的工作组.zip

    3. 接下来,可以使用`System.DirectoryServices`命名空间的`DirectoryEntry`和`DirectorySearcher`类,结合LDAP(轻量级目录访问协议)查询,查找网络上的工作组。例如,创建一个`DirectoryEntry`对象,设置其路径为...

Global site tag (gtag.js) - Google Analytics