mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-24 08:20:31 +08:00
fix: support Microsoft AD user search (#704)
This commit is contained in:
parent
28b9154d7e
commit
fb7e2729c6
@ -42,6 +42,7 @@ type Ldap struct {
|
|||||||
|
|
||||||
type ldapConn struct {
|
type ldapConn struct {
|
||||||
Conn *goldap.Conn
|
Conn *goldap.Conn
|
||||||
|
IsAD bool
|
||||||
}
|
}
|
||||||
|
|
||||||
//type ldapGroup struct {
|
//type ldapGroup struct {
|
||||||
@ -78,6 +79,13 @@ type LdapRespUser struct {
|
|||||||
Address string `json:"address"`
|
Address string `json:"address"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ldapServerType struct {
|
||||||
|
Vendorname string
|
||||||
|
Vendorversion string
|
||||||
|
IsGlobalCatalogReady string
|
||||||
|
ForestFunctionality string
|
||||||
|
}
|
||||||
|
|
||||||
func LdapUsersToLdapRespUsers(users []ldapUser) []LdapRespUser {
|
func LdapUsersToLdapRespUsers(users []ldapUser) []LdapRespUser {
|
||||||
returnAnyNotEmpty := func(strs ...string) string {
|
returnAnyNotEmpty := func(strs ...string) string {
|
||||||
for _, str := range strs {
|
for _, str := range strs {
|
||||||
@ -104,6 +112,45 @@ func LdapUsersToLdapRespUsers(users []ldapUser) []LdapRespUser {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isMicrosoftAD(Conn *goldap.Conn) (bool, error) {
|
||||||
|
SearchFilter := "(objectclass=*)"
|
||||||
|
SearchAttributes := []string{"vendorname", "vendorversion", "isGlobalCatalogReady", "forestFunctionality"}
|
||||||
|
|
||||||
|
searchReq := goldap.NewSearchRequest("",
|
||||||
|
goldap.ScopeBaseObject, goldap.NeverDerefAliases, 0, 0, false,
|
||||||
|
SearchFilter, SearchAttributes, nil)
|
||||||
|
searchResult, err := Conn.Search(searchReq)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if len(searchResult.Entries) == 0 {
|
||||||
|
return false, errors.New("no result")
|
||||||
|
}
|
||||||
|
isMicrosoft := false
|
||||||
|
var ldapServerType ldapServerType
|
||||||
|
for _, entry := range searchResult.Entries {
|
||||||
|
for _, attribute := range entry.Attributes {
|
||||||
|
switch attribute.Name {
|
||||||
|
case "vendorname":
|
||||||
|
ldapServerType.Vendorname = attribute.Values[0]
|
||||||
|
case "vendorversion":
|
||||||
|
ldapServerType.Vendorversion = attribute.Values[0]
|
||||||
|
case "isGlobalCatalogReady":
|
||||||
|
ldapServerType.IsGlobalCatalogReady = attribute.Values[0]
|
||||||
|
case "forestFunctionality":
|
||||||
|
ldapServerType.ForestFunctionality = attribute.Values[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ldapServerType.Vendorname == "" &&
|
||||||
|
ldapServerType.Vendorversion == "" &&
|
||||||
|
ldapServerType.IsGlobalCatalogReady == "TRUE" &&
|
||||||
|
ldapServerType.ForestFunctionality != "" {
|
||||||
|
isMicrosoft = true
|
||||||
|
}
|
||||||
|
return isMicrosoft, err
|
||||||
|
}
|
||||||
|
|
||||||
func GetLdapConn(host string, port int, adminUser string, adminPasswd string) (*ldapConn, error) {
|
func GetLdapConn(host string, port int, adminUser string, adminPasswd string) (*ldapConn, error) {
|
||||||
conn, err := goldap.Dial("tcp", fmt.Sprintf("%s:%d", host, port))
|
conn, err := goldap.Dial("tcp", fmt.Sprintf("%s:%d", host, port))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -115,7 +162,11 @@ func GetLdapConn(host string, port int, adminUser string, adminPasswd string) (*
|
|||||||
return nil, fmt.Errorf("fail to login Ldap server with [%s]", adminUser)
|
return nil, fmt.Errorf("fail to login Ldap server with [%s]", adminUser)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &ldapConn{Conn: conn}, nil
|
isAD, err := isMicrosoftAD(conn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("fail to get Ldap server type [%s]", adminUser)
|
||||||
|
}
|
||||||
|
return &ldapConn{Conn: conn, IsAD: isAD}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME: The Base DN does not necessarily contain the Group
|
//FIXME: The Base DN does not necessarily contain the Group
|
||||||
@ -158,10 +209,19 @@ func (l *ldapConn) GetLdapUsers(baseDn string) ([]ldapUser, error) {
|
|||||||
SearchFilter := "(objectClass=posixAccount)"
|
SearchFilter := "(objectClass=posixAccount)"
|
||||||
SearchAttributes := []string{"uidNumber", "uid", "cn", "gidNumber", "entryUUID", "mail", "email",
|
SearchAttributes := []string{"uidNumber", "uid", "cn", "gidNumber", "entryUUID", "mail", "email",
|
||||||
"emailAddress", "telephoneNumber", "mobile", "mobileTelephoneNumber", "registeredAddress", "postalAddress"}
|
"emailAddress", "telephoneNumber", "mobile", "mobileTelephoneNumber", "registeredAddress", "postalAddress"}
|
||||||
|
SearchFilterMsAD := "(objectClass=user)"
|
||||||
searchReq := goldap.NewSearchRequest(baseDn,
|
SearchAttributesMsAD := []string{"uidNumber", "sAMAccountName", "cn", "gidNumber", "entryUUID", "mail", "email",
|
||||||
goldap.ScopeWholeSubtree, goldap.NeverDerefAliases, 0, 0, false,
|
"emailAddress", "telephoneNumber", "mobile", "mobileTelephoneNumber", "registeredAddress", "postalAddress"}
|
||||||
SearchFilter, SearchAttributes, nil)
|
var searchReq *goldap.SearchRequest
|
||||||
|
if l.IsAD {
|
||||||
|
searchReq = goldap.NewSearchRequest(baseDn,
|
||||||
|
goldap.ScopeWholeSubtree, goldap.NeverDerefAliases, 0, 0, false,
|
||||||
|
SearchFilterMsAD, SearchAttributesMsAD, nil)
|
||||||
|
} else {
|
||||||
|
searchReq = goldap.NewSearchRequest(baseDn,
|
||||||
|
goldap.ScopeWholeSubtree, goldap.NeverDerefAliases, 0, 0, false,
|
||||||
|
SearchFilter, SearchAttributes, nil)
|
||||||
|
}
|
||||||
searchResult, err := l.Conn.SearchWithPaging(searchReq, 100)
|
searchResult, err := l.Conn.SearchWithPaging(searchReq, 100)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -180,12 +240,14 @@ func (l *ldapConn) GetLdapUsers(baseDn string) ([]ldapUser, error) {
|
|||||||
case "uidNumber":
|
case "uidNumber":
|
||||||
ldapUserItem.UidNumber = attribute.Values[0]
|
ldapUserItem.UidNumber = attribute.Values[0]
|
||||||
case "uid":
|
case "uid":
|
||||||
|
case "sAMAccountName":
|
||||||
ldapUserItem.Uid = attribute.Values[0]
|
ldapUserItem.Uid = attribute.Values[0]
|
||||||
case "cn":
|
case "cn":
|
||||||
ldapUserItem.Cn = attribute.Values[0]
|
ldapUserItem.Cn = attribute.Values[0]
|
||||||
case "gidNumber":
|
case "gidNumber":
|
||||||
ldapUserItem.GidNumber = attribute.Values[0]
|
ldapUserItem.GidNumber = attribute.Values[0]
|
||||||
case "entryUUID":
|
case "entryUUID":
|
||||||
|
case "objectGUID":
|
||||||
ldapUserItem.Uuid = attribute.Values[0]
|
ldapUserItem.Uuid = attribute.Values[0]
|
||||||
case "mail":
|
case "mail":
|
||||||
ldapUserItem.Mail = attribute.Values[0]
|
ldapUserItem.Mail = attribute.Values[0]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user