theme: Chinese-red

「这是我参加11月更文挑战的第 8 天,流动详情查看:2021最初一次更文挑战」

上一篇咱们分享了如何将 ldif 格局的数据,转换成 json 数据的思路并画相应的简图

这一次,咱们就来实现一下

实现形式如下:

  • 连贯服务器,查问 ldap 服务器上数据结构 ,goalng 如何获取 ldap 服务器的数据? 有说到
  • 遍历每一条 entry
  • 解决每一条 entry 的时候,从右到左获取相应的 rdn(对应的键和值),并给每一个 rdn 创立一个 多叉树的 节点
  • basedn 对应的节点 和 每一个 ou 对应的节点地址,寄存到一个 map(key 是 string,value 是节点的地址) 中便于后续遍历解决其余 entry 的时候,间接通过 ou 名字获取对应节点地址即可
  • 对于一个节点上面的用户,间接挂到这个节点上即可

来一起看看数据结构和 main 函数

数据结构为节点的必要信息

// 节点信息type lNode struct {    Name     string    Path     string    Children []*lNode    User     []string}// 新建一个节点func NewNode(name, path string) *lNode {    return &lNode{        Name:     name,        Path:     path,        Children: []*lNode{},        User:     []string{},    }}

main 函数的执行流程具体如下:

  • 连贯ldap 服务器并查问对应数据
  • 解决数据并生成一颗树 (默认 dc 为 根节点, / )
  • 将树转成 json 格局,进行打印输出
func main() {    data := connectLdap(        "ldap://xxxx",        "dc=xiaomotong,dc=com",        "cn=admin,dc=xiaomotong,dc=com",        "123123",        "(&(objectClass=*))")    if len(data) <= 0 {        fmt.Println("search no data !!")    }    mp := make(map[string]*lNode)    root := NewNode("dc=xiaomotong,dc=com", "/")    mp["dc=xiaomotong,dc=com"] = root    // 生成一颗树    CreateLdapTree(mp, data, "dc=xiaomotong,dc=com")    b, err := json.Marshal(root)    if err != nil {        fmt.Println("json.Marshal error !!!")        return    }    fmt.Println(string(b))}

从 ldap 服务器上获取数据

咱们简略就在 一个 main.go 文件中实现一下,代码构造是这样的

func connectLdap(addr, baseDB, username, passwd, filter string) []*ldap.Entry { 函数的具体实现,在文章 goalng 如何获取 ldap 服务器的数据? 有体现,咱们这一次只是将参数调整了一下

解决 ldap 响应的数据

ldap 返回的数据是以 ldif 格局返回的,会返回0条到多条 entry,咱们须要一一的来解析每一个 entry 外面的数据

一个 entry 就是一个 DN ,一个 DN 外面有多个 RDN,一个 RDN 就是一个键值对

  • 创立根节点,信息是 BASEDN :dc=xiaomotong,dc=com , 并将信息放到 map 中

  • 开始解析数据每一条 dn,dn 中的 每一个 rdn 创立对应的节点,并通过dn 从右到左的程序,将 rdn 连接起来
  • 一个组外面有子组,就放在 node 的 Children 外面, 一个组外面的 用户就放在 User外面,以后节点的名字 放在 name中,以后节点的绝对路径就放在 path 中

来看看 func CreateLdapTree(mp map[string]*lNode, Entries []*ldap.Entry, BASEDN string) { 函数

// 创立一棵树func CreateLdapTree(mp map[string]*lNode, Entries []*ldap.Entry, BASEDN string) {    // 遍历 Entries    for _, Entry := range Entries {        if BASEDN == Entry.DN {            continue        }        ProcessDN(Entry.DN, mp, BASEDN)    }}

CreateLdapTree 外面具体的实现是遍历 ldap 的所有 entry,并调用 ProcessDN 函数来解析 dn 数据,且依据 dn 来生成对应的多叉树片段

具体解决 DN 数据

func ProcessDN(DN string, mp map[string]*lNode, BASEDN string) { 是具体解决 DN 数据的次要函数

  • 次要做的是解析一条 DN 数据,并生成一个多叉树的片段
  • ou 的节点地址会相应放到 map 中进行记录,便于后续应用

解决的逻辑,会去判断 rdn 的 key 是 dc,cn,ou,来做相应的解决,如果是 ou 就创立节点,并将节点的地址记录在 map 中

json 序列化

最初将数据结构序列化成 json,并以字符串的形式打印进去

上述代码逻辑也比较简单,就是将 ldif 转成树而已,代码流程是

整个 main.go 文件,执行之后,后果如下,胜利将 ldif 转成多叉树,且已 json 的形式展示进去

{    "Name": "dc=xiaomotong,dc=com",    "Path": "/",    "Children": [        {            "Name": "People",            "Path": "/People/",            "Children": [],            "User": [                "xiaozhupeiqi"            ]        },        {            "Name": "dev",            "Path": "/dev/",            "Children": [                {                    "Name": "golang",                    "Path": "/dev/golang/",                    "Children": [],                    "User": [                        "xiaoppp"                    ]                },                {                    "Name": "clang",                    "Path": "/dev/clang/",                    "Children": [                        {                            "Name": "woshixiaozhu",                            "Path": "/dev/clang/woshixiaozhu/",                            "Children": [],                            "User": [                                "xiaopang2"                            ]                        }                    ],                    "User": []                },                {                    "Name": "java",                    "Path": "/dev/java/",                    "Children": [],                    "User": []                }            ],            "User": []        }    ],    "User": [        "admin",        "zhangsan",        "xiaopang",        "xiaopang2"    ]}

学习所得,如有偏差,还请不吝赐教,仔细的敌人会发现上述逻辑有坑,下次见

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是小魔童哪吒,欢送点赞关注珍藏,下次见~