简介
LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,相同的目录服务软件有Active Directory
目录服务优点:
- 为查询、浏览、搜索优化的专业分布数据库,树状结构,类似linux文件目录。
- 优秀的读性能、写性能差,没有事务处理、回滚等复杂操作。
- 用于查询的信息系统,比如:企业员工信息(姓名、电话)、公司物理设备信息(IP、厂商)
概念
- 记录项 Entry
LDAP中最基本单位。类似数据库一条记录,对LDAP的添加、删除、更改、检索都以条目为基本对象。
dn:条目的唯一标识(distinguished Name),类似索引。如dn:"cn=baby,ou=marketing,ou=people,dc=mydomain,dc=org"
。其实cn=baby
、ou=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 域名零件
-
属性 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
-
下载包
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
-
登录验证
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 }
有疑问加站长微信联系(非本文作者)