首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Golang与LDAP通信

Golang与LDAP通信
EN

Stack Overflow用户
提问于 2016-01-15 15:48:11
回答 4查看 23.5K关注 0票数 7

我正在尝试用golang连接和验证用户到ldap的身份。

我使用的是go-ldap客户端和下面的示例代码:

代码语言:javascript
运行
复制
package main

import (
    "log"
    "github.com/jtblin/go-ldap-client"
)

func main() {
    client := &ldap.LDAPClient{
        Base:         "dc=example,dc=com",
        Host:         "ldap.example.com",
        Port:         389,
        UseSSL:       false,
        BindDN:       "uid=readonlysuer,ou=People,dc=example,dc=com",
        BindPassword: "readonlypassword",
        UserFilter:   "(uid=%s)",
        GroupFilter: "(memberUid=%s)",
        Attributes:   []string{"givenName", "sn", "mail", "uid"},
    }
    # It is the responsibility of the caller to close the connection
    defer client.Close()

    ok, user, err := client.Authenticate("username", "password")
    if err != nil {
        log.Fatalf("Error authenticating user %s: %+v", "username", err)
    }
    if !ok {
        log.Fatalf("Authenticating failed for user %s", "username")
    }
    log.Printf("User: %+v", user)

    groups, err := client.GetGroupsOfUser("username")
    if err != nil {
        log.Fatalf("Error getting groups for user %s: %+v", "username", err)
    }
    log.Printf("Groups: %+v", groups) 
}

安装了gopkg.in/ldap.v2的依赖项。

问题是,我得到了下面的错误

代码语言:javascript
运行
复制
2016/01/15 17:34:55 Error authenticating user username: LDAP Result Code 2 "Protocol Error": ldap: cannot StartTLS (unsupported extended operation)
exit status 1

对这个错误有什么暗示吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-10-03 13:41:33

好的,让我们尝试使用github.com/go-ldap/ldap进行身份验证。首先,您需要创建一个*ldap.Conn。如果LDAP服务器支持TLS,我建议您使用TLS:

代码语言:javascript
运行
复制
// TLS, for testing purposes disable certificate verification, check https://golang.org/pkg/crypto/tls/#Config for further information.
tlsConfig := &tls.Config{InsecureSkipVerify: true}
l, err := ldap.DialTLS("tcp", "ldap.example.com:636", tlsConfig)

// No TLS, not recommended
l, err := ldap.Dial("tcp", "ldap.example.com:389")

现在,您应该有一个与LDAP服务器的活动连接。使用此连接,您必须执行绑定:

代码语言:javascript
运行
复制
err := l.Bind("user@test.com", "password")
if err != nil {
    // error in ldap bind
    log.Println(err)
}
// successful bind
票数 13
EN

Stack Overflow用户

发布于 2020-05-29 23:49:50

使用去-守护者 LDAP策略的另一个可能的解决方案

一个基于联机LDAP测试服务器的工作实例

代码语言:javascript
运行
复制
package main

import (
    "fmt"
    "github.com/shaj13/go-guardian/auth/strategies/ldap"
    "net/http"
)

func main() {
    cfg := ldap.Config{
        BaseDN:       "dc=example,dc=com",
        BindDN:       "cn=read-only-admin,dc=example,dc=com",
        Port:         "389",
        Host:         "ldap.forumsys.com",
        BindPassword: "password",
        Filter:       "(uid=%s)",
    }

    r, _ := http.NewRequest("GET", "/", nil)
    r.SetBasicAuth("tesla", "password")

    user, err := ldap.New(&cfg).Authenticate(r.Context(), r)
    fmt.Println(user, err)
}
票数 0
EN

Stack Overflow用户

发布于 2020-06-04 07:13:42

问题是默认情况下,在上述LDAP客户机中没有设置"SkipTLS“标志。您需要显式地将参数设置为false:

代码语言:javascript
运行
复制
client := &ldap.LDAPClient{
        Base:         "dc=example,dc=com",
        Host:         "ldap.example.com",
        Port:         389,
        UseSSL:       false,
        BindDN:       "uid=readonlysuer,ou=People,dc=example,dc=com",
        BindPassword: "readonlypassword",
        UserFilter:   "(uid=%s)",
        GroupFilter:  "(memberUid=%s)",
        SkipTLS:      true,
        Attributes:   []string{"givenName", "sn", "mail", "uid"},
    }

我将SkipTLS设置为true,它起了作用。希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34814834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档