golang 实现 ldif 数据转成 json 初探

2023-04-18  本文已影响0人  阿兵云原生

theme: Chinese-red

「这是我参与11月更文挑战的第 8 天,活动详情查看:2021最后一次更文挑战

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

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

实现方式如下:

来一起看看数据结构和 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 函数的执行流程具体如下:

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 文件中实现一下,代码结构是这样的

[图片上传失败...(image-8307fc-1681905703465)]

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

[图片上传失败...(image-986a64-1681905703466)]

处理 ldap 响应的数据

ldap 返回的数据是以 ldif 格式返回的,会返回0条到多条 entry,我们需要逐个的来解析每一个 entry 里面的数据

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

[图片上传失败...(image-ef5653-1681905703466)]

[图片上传失败...(image-addda5-1681905703466)]

来看看 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 数据的主要函数

[图片上传失败...(image-4b1340-1681905703466)]

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

json 序列化

最后将数据结构序列化成 json,并以字符串的方式打印出来

[图片上传失败...(image-b76734-1681905703466)]

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

[图片上传失败...(image-ba5b30-1681905703466)]

整个 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"
    ]
}

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

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

[图片上传失败...(image-9485db-1681905703466)]

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

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

上一篇 下一篇

猜你喜欢

热点阅读