千家信息网

什么是go ldap连接

发表于:2025-02-21 作者:千家信息网编辑
千家信息网最后更新 2025年02月21日,本篇内容主要讲解"什么是go ldap连接",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"什么是go ldap连接"吧!ldap连接// LdapConn
千家信息网最后更新 2025年02月21日什么是go ldap连接

本篇内容主要讲解"什么是go ldap连接",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"什么是go ldap连接"吧!

ldap连接

// LdapConn LDAP服务器连接配置type LdapConn struct {        gorm.Model        // 连接地址        ConnUrl string `json:"conn_url" gorm:"type:varchar(255);unique_index;not null;comment:连接地址 逻辑外键"`        // SSL加密方式        SslEncryption bool `json:"ssl_encryption" gorm:"type:tinyint;length:1;comment:SSL加密方式"`        // 超时设置        Timeout time.Duration `json:"timeout" gorm:"type:int;comment:超时设置"`        // 根目录        BaseDn string `json:"base_dn" gorm:"type:varchar(255);not null;comment:根目录"`        // 用户名        AdminAccount string `json:"admin_account" gorm:"type:varchar(255);not null;comment:用户名"`        // 密码        Password string `json:"password" gorm:"type:varchar(255);not null;comment:密码"`}type LdapAttributes struct {        // ldap字段        Num         string `json:"employeeNumber" gorm:"type:varchar(100);unique_index"`     // 工号        Sam         string `json:"sAMAccountName" gorm:"type:varchar(128);unique_index"`     // SAM账号        Dn          string `json:"distinguishedName" gorm:"type:varchar(100);unique_index"`  // dn        AccountCtl  string `json:"UserAccountControl" gorm:"type:varchar(100);unique_index"` // 用户账户控制        Expire      string `json:"accountExpires" gorm:"type:varchar(100);unique_index"`     //  账户过期时间        PwdLastSet  string `json:"pwdLastSet" gorm:"type:varchar(100);unique_index"`         //  用户下次登录必须修改密码        WhenCreated string `json:"whenCreated" gorm:"type:varchar(100);unique_index"`        //  创建时间        WhenChanged string `json:"whenChanged" gorm:"type:varchar(100);unique_index"`        //  修改时间        DisplayName string `json:"displayName" gorm:"type:varchar(32);unique_index"`         //  真实姓名        Sn          string `json:"sn" gorm:"type:varchar(100);unique_index"`                 //  姓        Name        string `json:"name" gorm:"type:varchar(100);unique_index"`               // 姓名        GivenName   string `json:"givenName" gorm:"type:varchar(100);unique_index"`          // 名        Email       string `json:"mail" gorm:"type:varchar(128);unique_index"`               // 邮箱        Phone       string `json:"mobile" gorm:"type:varchar(32);unique_index"`              // 移动电话        Company     string `json:"company" gorm:"type:varchar(128);unique_index"`            // 公司        Depart      string `json:"department" gorm:"type:varchar(128);unique_index"`         // 部门        Title       string `json:"title" gorm:"type:varchar(100);unique_index"`              // 职务}var attrs = []string{        "employeeNumber",     // 工号        "sAMAccountName",     // SAM账号        "distinguishedName",  // dn        "UserAccountControl", // 用户账户控制        "accountExpires",     // 账户过期时间        "pwdLastSet",         // 用户下次登录必须修改密码        "whenCreated",        // 创建时间        "whenChanged",        // 修改时间        "displayName",        // 显示名        "sn",                 // 姓        "name",        "givenName",  // 名        "mail",       // 邮箱        "mobile",     // 手机号        "company",    // 公司        "department", // 部门        "title",      // 职务}// Init 实例化一个 ldapConnfunc Init(c *LdapConn) *LdapConn {        return &LdapConn{                ConnUrl:       c.ConnUrl,                SslEncryption: c.SslEncryption,                Timeout:       c.Timeout,                BaseDn:        c.BaseDn,                AdminAccount:  c.AdminAccount,                Password:      c.Password,        }}// 获取ldap连接func NewLdapConn(conn *LdapConn) (l *ldap.Conn, err error) {        // 建立ldap连接        l, err = ldap.DialURL(conn.ConnUrl)        // 设置超时时间        l.SetTimeout(time.Duration(conn.Timeout))        if err != nil {                log.Log().Error("dial ldap url failed,err:%v", err)                return        }        // defer l.Close()        // 重新连接TLS        err = l.StartTLS(&tls.Config{InsecureSkipVerify: true})        if err != nil {                log.Log().Error("start tls failed,err:%v", err)                return        }        // 首先与只读用户绑定        err = l.Bind(conn.AdminAccount, conn.Password)        if err != nil {                log.Log().Error("admin user auth failed,err:%v", err)                return        }        return}

查询ldap用户

// 查询所有用户func FetchLdapUsers(conn *LdapConn) (LdapUsers []*LdapAttributes) {        ldap_conn, err := NewLdapConn(conn) // 建立ldap连接        if err != nil {                log.Log().Error("setup ldap connect failed,err:%v\n", err)        }        defer ldap_conn.Close()        searchRequest := ldap.NewSearchRequest(                conn.BaseDn, // 待查询的base dn                ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,                "(objectclass=user)", // 过滤规则                attrs,                // 待查询属性列表                nil,        )        sr, err := ldap_conn.Search(searchRequest)        if err != nil {                log.Log().Error("查询用户出错:%v", err)        }        for _, entry := range sr.Entries {                LdapUsers = append(LdapUsers,                        &LdapAttributes{                                Num:         entry.GetAttributeValue("employeeNumber"),                                Sam:         entry.GetAttributeValue("sAMAccountName"),                                Dn:          entry.GetAttributeValue("distinguishedName"),                                AccountCtl:  entry.GetAttributeValue("UserAccountControl"),                                Expire:      entry.GetAttributeValue("accountExpires"),                                PwdLastSet:  entry.GetAttributeValue("pwdLastSet"),                                WhenCreated: entry.GetAttributeValue("whenCreated"),                                WhenChanged: entry.GetAttributeValue("whenChanged"),                                DisplayName: entry.GetAttributeValue("displayName"),                                Sn:          entry.GetAttributeValue("sn"),                                Name:        entry.GetAttributeValue("name"),                                GivenName:   entry.GetAttributeValue("givenName"),                                Email:       entry.GetAttributeValue("mail"),                                Phone:       entry.GetAttributeValue("mobile"),                                Company:     entry.GetAttributeValue("company"),                                Depart:      entry.GetAttributeValue("department"),                                Title:       entry.GetAttributeValue("title"),                        },                )        }        return}

测试方法 go test下可以输出查询到的用户信息

// func TestLdapConn(t *testing.T) {//         conn := Init(//                 &LdapConn{//                         ConnUrl:       "ldap://192.168.6.66:389",//                         BaseDn:        "OU=赢麻了,DC=YML,DC=com",//                         AdminAccount:  "CN=Administrator,CN=Users,DC=YML,DC=com",//                         Password:      "tasdfjyml556sbsdf",//                         SslEncryption: false,//                         Timeout:       5 * time.Second,//                 })//         users := FetchLdapUsers(conn)//         for _, user := range users {//                 fmt.Println(user)//                 break//         }// }

新增用户

// 批量新增用户 (AddLdapUsersRes []bool)func AddLdapUsers(conn *model.LdapConn, LdapUsers []*LdapAttributes) (AddLdapUsersRes []bool) {        ldap_conn, err := NewLdapConn(conn) // 建立ldap连接        if err != nil {                log.Log().Error("setup ldap connect failed,err:%v\n", err)        }        defer ldap_conn.Close()        // 批量处理        for _, user := range LdapUsers {                addReq := ldap.NewAddRequest("CN="+user.DisplayName+user.Sam+","+conn.BaseDn, nil)         // 指定新用户的dn 会同时给cn name字段赋值                addReq.Attribute("objectClass", []string{"top", "organizationalPerson", "user", "person"}) // 必填字段 否则报错 LDAP Result Code 65 "Object Class Violation"                addReq.Attribute("employeeNumber", []string{user.Num})                                     // 工号 暂时没用到                addReq.Attribute("sAMAccountName", []string{user.Sam})                                     // 登录名 必填                addReq.Attribute("UserAccountControl", []string{user.AccountCtl})                          // 账号控制 544 是启用用户                // addReq.Attribute("accountExpires", []string{user.Expire})                                  // 账号过期时间 当前时间加一个时间差并转换为NT时间                addReq.Attribute("pwdLastSet", []string{user.PwdLastSet})   // 用户下次登录必须修改密码 0是永不过期                addReq.Attribute("displayName", []string{user.DisplayName}) // 真实姓名 某些系统需要                addReq.Attribute("sn", []string{user.Sn})                   // 姓                addReq.Attribute("givenName", []string{user.GivenName})     // 名                addReq.Attribute("mail", []string{user.Email})              // 邮箱 必填                addReq.Attribute("mobile", []string{user.Phone})            // 手机号 必填 某些系统需要                addReq.Attribute("company", []string{user.Company})                addReq.Attribute("department", []string{user.Depart})                addReq.Attribute("title", []string{user.Title})                if err = ldap_conn.Add(addReq); err != nil {                        if ldap.IsErrorWithCode(err, 68) {                                log.Log().Error("User already exist: %s", err)                        } else {                                log.Log().Error("User insert error: %s", err)                        }                        AddLdapUsersRes = append(AddLdapUsersRes, false)                        return                }                AddLdapUsersRes = append(AddLdapUsersRes, true)        }        return}

测试 可以批量创建

func TestAddLdapUsers(t *testing.T) {        conn := Init(                &model.LdapConn{                        ConnUrl:       "ldap://192.168.6.66:389",                        BaseDn:        "OU=上海总部,OU=赢麻了科技,DC=YML,DC=com",                        AdminAccount:  "CN=Administrator,CN=Users,DC=YML,DC=com",                        Password:      "tasdfjyml556sbsdf",                        SslEncryption: false,                        Timeout:       5 * time.Second,                })        var LdapUsers []*LdapAttributes = make([]*LdapAttributes, 0, 5)        LdapUsers = append(LdapUsers,                &LdapAttributes{                        Dn:          "CN=" + "张三" + "2333" + "," + conn.BaseDn, // dn                        Num:         "2333",                                    // 工号                        Sam:         "2333",                        AccountCtl:  "544",                        Expire:      "1",                        PwdLastSet:  "0",                        DisplayName: "张三",                        Sn:          "张",                        GivenName:   "三",                        Email:       "2333yml@qq.com",                        Phone:       "1583456789",                        Company:     "赢麻了科技",                        Depart:      "财务部",                        Title:       "牛魔王",                })        LdapUsers = append(LdapUsers,                &LdapAttributes{                        Dn:          "CN=" + "王五" + "2555" + "," + conn.BaseDn, // dn                        Num:         "2555",                                    // 工号                        Sam:         "2555",                        AccountCtl:  "544",                        Expire:      "1",                        PwdLastSet:  "0",                        DisplayName: "王五",                        Sn:          "张",                        GivenName:   "五",                        Email:       "25555yml@qq.com",                        Phone:       "1583455555",                        Company:     "赢麻了科技",                        Depart:      "财务部",                        Title:       "蝎子精",                })        res := AddLdapUsers(conn, LdapUsers)        for index, r := range res {                fmt.Println(index, r)        }}

结果

到此,相信大家对"什么是go ldap连接"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0