ldap_auth.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package auth
  2. import (
  3. "git.qianqiusoft.com/qianqiusoft/light-apiengine/ldap"
  4. "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
  5. "git.qianqiusoft.com/qianqiusoft/light-apiengine/logs"
  6. "git.qianqiusoft.com/qianqiusoft/light-apiengine/config"
  7. "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  8. "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
  9. "net"
  10. "fmt"
  11. "strings"
  12. )
  13. type LdapAuth struct {
  14. App entitys.ApiEngineInterface
  15. IAuth
  16. }
  17. func NewLdapAuth(app entitys.ApiEngineInterface) *LdapAuth {
  18. return &LdapAuth{App:app}
  19. }
  20. func (this *LdapAuth)Login(c *entitys.CtrlContext) {
  21. }
  22. func (this *LdapAuth)Logout(c *entitys.CtrlContext){
  23. }
  24. func (this* LdapAuth)Init(){
  25. s := ldap.NewServer()
  26. // register Bind and Search function handlers
  27. handler := ldapHandler{this.App}
  28. s.BindFunc("", handler)
  29. s.SearchFunc("", handler)
  30. // start the server
  31. listen :=fmt.Sprintf(":%d", config.AppConfig.LdapPort)
  32. logs.Info("Starting example LDAP server on %s", listen)
  33. if err := s.ListenAndServe(listen); err != nil {
  34. logs.Error("LDAP Server Failed: %s", err.Error())
  35. }
  36. }
  37. type ldapHandler struct {
  38. App entitys.ApiEngineInterface
  39. }
  40. ///////////// Allow anonymous binds only
  41. func (h ldapHandler) Bind(bindDN, bindSimplePw string, conn net.Conn) (ldap.LDAPResultCode, error) {
  42. fmt.Println("bind:",bindDN)
  43. fmt.Println("pwd:", bindSimplePw)
  44. if bindDN == "cn=qianqiuiot" {
  45. if bindSimplePw == "qianqiuiot.com" {
  46. return ldap.LDAPResultSuccess, nil
  47. }else {
  48. return ldap.LDAPResultCompareFalse, nil
  49. }
  50. }
  51. userName := bindDN[3:]
  52. password := bindSimplePw
  53. var user models.SysUser
  54. ret, err := h.App.GetBusinessDb("qianqiuiot.com").SQL(models.SqlUserLogin, userName).Get(&user)
  55. if ret && err == nil {
  56. md5Pwd := utils.HashPassword(password, "")
  57. //密码错误
  58. if !strings.EqualFold(user.Password, md5Pwd) {
  59. fmt.Println("密码错误")
  60. return ldap.LDAPResultCompareFalse, nil
  61. }else {
  62. fmt.Println("密码正确")
  63. return ldap.LDAPResultSuccess, nil
  64. }
  65. }
  66. fmt.Println("出错", err)
  67. return ldap.LDAPResultCompareFalse, err
  68. }
  69. ///////////// Return some hardcoded search results - we'll respond to any baseDN for testing
  70. func (h ldapHandler) Search(boundDN string, searchReq ldap.SearchRequest, conn net.Conn) (ldap.ServerSearchResult, error) {
  71. fmt.Printf("%s,search......%s\n", boundDN, searchReq)
  72. userName := ""
  73. if boundDN == "cn=qianqiuiot" {
  74. if searchReq.Filter == "(objectClass=*)" {
  75. uid := searchReq.BaseDN
  76. dn := uid
  77. if dn == "" {
  78. dn = boundDN
  79. }
  80. entries := []*ldap.Entry{
  81. &ldap.Entry{dn, []*ldap.EntryAttribute{
  82. //&ldap.EntryAttribute{"uid", []string{}},
  83. }},
  84. }
  85. return ldap.ServerSearchResult{entries, []string{}, []ldap.Control{}, ldap.LDAPResultSuccess}, nil
  86. }else {
  87. start := strings.Index(searchReq.Filter, "uid=")
  88. end := strings.Index(searchReq.Filter[start:], ")")
  89. fmt.Println("%d,%d", start, end)
  90. userName = searchReq.Filter[start+4 : start+end]
  91. fmt.Println(userName)
  92. }
  93. }else {
  94. userName = boundDN[3:]
  95. }
  96. var user models.SysUser
  97. ret, err := h.App.GetBusinessDb("qianqiuiot.com").SQL(models.SqlUserLogin, userName).Get(&user)
  98. if ret && err == nil {
  99. entries := []*ldap.Entry{
  100. &ldap.Entry{"cn=" + user.LoginId, []*ldap.EntryAttribute{
  101. &ldap.EntryAttribute{"cn", []string{user.Name}},
  102. &ldap.EntryAttribute{"uidNumber", []string{user.Id}},
  103. &ldap.EntryAttribute{"accountStatus", []string{"active"}},
  104. &ldap.EntryAttribute{"uid", []string{user.LoginId}},
  105. &ldap.EntryAttribute{"description", []string{user.Name}},
  106. &ldap.EntryAttribute{"objectClass", []string{"posixAccount"}},
  107. }},
  108. }
  109. return ldap.ServerSearchResult{entries, []string{}, []ldap.Control{}, ldap.LDAPResultSuccess}, err
  110. }else {
  111. return ldap.ServerSearchResult{nil, []string{}, []ldap.Control{}, ldap.LDAPResultCompareFalse}, err
  112. }
  113. }