LDAP初探

度_73ea · · 2693 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

简介

LDAP服务器的概念和原理简单介绍

LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,相同的目录服务软件有Active Directory

目录服务优点:

  • 为查询、浏览、搜索优化的专业分布数据库,树状结构,类似linux文件目录。
  • 优秀的读性能、写性能差,没有事务处理、回滚等复杂操作。
  • 用于查询的信息系统,比如:企业员工信息(姓名、电话)、公司物理设备信息(IP、厂商)

概念

LDAP中CN、OU、DC

  1. 记录项 Entry

​ LDAP中最基本单位。类似数据库一条记录,对LDAP的添加、删除、更改、检索都以条目为基本对象。

dn:条目的唯一标识(distinguished Name),类似索引。如dn:"cn=baby,ou=marketing,ou=people,dc=mydomain,dc=org" 。其实cn=babyou=marketing都是目录名而已。顶层目录名写在最右边,类似zookeeper中的key为 /org/mydomain/people/marketing/baby 但是目录名要加上一定的规范比如:dc、ou、cn等。

  • Base DN:LDAP目录树的最顶部是根,即Base DN,如dc=mydomain,dc=org

  • OU: Organization Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文

  • O : Organization 为组织名,可以3—64个字符长

  • C: Country为国家名,可选,为2个字符长

  • DC : Domain Component 域名零件

  1. 属性 Attribute

    每个条目都有很多属性,比如:人的姓名、地址、电话等

    属性 别名 语法 描述 值(举例)
    commonName cn Directory String 姓名 sean
    surname sn Directory String Chow
    organizationalUnitName ou Directory String 单位(部门)名称 IT_SECTION
    organization o Directory String 组织(公司)名称 example
    objectClass 内置属性 organizationalPerson

连接LDAP的工具

windows通过下载 LDAP Admin 连接后可查看LDAP里面的数据及格式。 连接LDAP的工具 CSDN

Go操作LDAP

使用点:每次用户登陆校验密码(确保密码唯一性);定期同步用户其他信息到本地系统用于处理(确保数据同步)

Ldap GoDoc ldap Github Golang连接LDAP CSDN

  1. 下载包

    cd $GOPATH/src/gopkg.in/
    git clone https://github.com/go-asn1-ber/asn1-ber.git
    git clone https://github.com/go-ldap/ldap.git
    
  2. 登录验证

    const (
     url        = "l.auth.aa.com"
     port       = 389
     userName   = "Test"
     password   = "123456"
     baseDN     = "ou=资产管理,dc=abc,dc=com"
     domainName = "AutoTest@abc.com"
    )
    
    func checkLogin() error {
     l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", url, port))
     if err != nil {
         return  err
     }
    
     err = l.StartTLS(&tls.Config{InsecureSkipVerify: true})
     if err != nil {
         return  err
     }
    
        // 绑定用于管理的用户
     err = l.Bind(userName, password)
     if err != nil {
         return  err
     }
    
        // 查询   
     sql := ldap.NewSearchRequest(baseDN,
         ldap.ScopeWholeSubtree,
         ldap.NeverDerefAliases,
         0,
         0,
         false,
             // "(&(objectClass=organizationalPerson))",   // 查询所有人 
         fmt.Sprintf("(&(objectClass=organizationalPerson)(uid=%s))", userEmail), //查询指定人
         []string{"cn", "uid"}, nil)
    
     cur, err = c.Con.Search(sql)
     if err != nil {
         return  err
     }
    
     if len(cur.Entries) == 0 {
         err = fmt.Errorf("%s does not exist", userEmail)
         return err
     }
    
     if len(cur.Entries) > 1 {
         err = fmt.Errorf("exist multiple %s", userEmail)
         return  err
     }
     
     userdn := cur.Entries[0].DN
        // 用户密码校验,一条对应的dn记录的密码校验
     err = c.Con.Bind(userdn, userPassword)
     if err != nil {
         return err
     }
    
     return nil
    }
    

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:度_73ea

查看原文:LDAP初探

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2693 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传