ldap.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package utils
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/astaxie/beego"
  6. "gopkg.in/ldap.v2"
  7. )
  8. /*
  9. 对应的config
  10. ldap:
  11. host: hostname.yourdomain.com //ldap服务器地址
  12. port: 3268 //ldap服务器端口
  13. attribute: mail //用户名对应ldap object属性
  14. base: DC=yourdomain,DC=com //搜寻范围
  15. user: CN=ldap helper,OU=yourdomain.com,DC=yourdomain,DC=com //第一次绑定用户
  16. password: p@sswd //第一次绑定密码
  17. ssl: false //使用使用ssl
  18. */
  19. func ValidLDAPLogin(password string) (result bool, err error) {
  20. result = false
  21. err = nil
  22. lc, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "192.168.3.104", 389))
  23. if err != nil {
  24. beego.Error("Dial => ", err)
  25. return
  26. }
  27. defer lc.Close()
  28. err = lc.Bind("cn=admin,dc=minho,dc=com", "123456")
  29. if err != nil {
  30. beego.Error("Bind => ", err)
  31. return
  32. }
  33. searchRequest := ldap.NewSearchRequest(
  34. "DC=minho,DC=com",
  35. ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
  36. fmt.Sprintf("(&(objectClass=User)(%s=%s))", "mail", "[email protected]"),
  37. []string{"dn"},
  38. nil,
  39. )
  40. searchResult, err := lc.Search(searchRequest)
  41. if err != nil {
  42. beego.Error("Search => ", err)
  43. return
  44. }
  45. if len(searchResult.Entries) != 1 {
  46. err = errors.New("ldap.no_user_found_or_many_users_found")
  47. return
  48. }
  49. fmt.Printf("%+v = %d", searchResult.Entries, len(searchResult.Entries))
  50. userdn := searchResult.Entries[0].DN
  51. err = lc.Bind(userdn, password)
  52. if err == nil {
  53. result = true
  54. } else {
  55. beego.Error("Bind2 => ", err)
  56. err = nil
  57. }
  58. return
  59. }
  60. func AddMember(account, password string) error {
  61. lc, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "192.168.3.104", 389))
  62. if err != nil {
  63. beego.Error("Dial => ", err)
  64. return err
  65. }
  66. defer lc.Close()
  67. user := fmt.Sprintf("cn=%s,dc=minho,dc=com", account)
  68. member := ldap.NewAddRequest(user)
  69. member.Attribute("mail", []string{"[email protected]"})
  70. err = lc.Add(member)
  71. if err == nil {
  72. err = lc.Bind(user, "")
  73. if err != nil {
  74. beego.Error("Bind => ", err)
  75. return err
  76. }
  77. passwordModifyRequest := ldap.NewPasswordModifyRequest(user, "", "1q2w3e__ABC")
  78. _, err = lc.PasswordModify(passwordModifyRequest)
  79. if err != nil {
  80. beego.Error("PasswordModify => ", err)
  81. return err
  82. }
  83. return nil
  84. }
  85. beego.Error("Add => ", err)
  86. return err
  87. }
  88. func ModifyPassword(account, old_password, new_password string) error {
  89. l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "192.168.3.104", 389))
  90. if err != nil {
  91. beego.Error("Dial => ", err)
  92. }
  93. defer l.Close()
  94. user := fmt.Sprintf("cn=%s,dc=minho,dc=com", account)
  95. err = l.Bind(user, old_password)
  96. if err != nil {
  97. beego.Error("Bind => ", err)
  98. return err
  99. }
  100. passwordModifyRequest := ldap.NewPasswordModifyRequest(user, old_password, new_password)
  101. _, err = l.PasswordModify(passwordModifyRequest)
  102. if err != nil {
  103. beego.Error(fmt.Sprintf("Password could not be changed: %s", err.Error()))
  104. return err
  105. }
  106. return nil
  107. }