通过python-ldap处理ldap服务器

原地址

    最近项目中加入LDAP认证方式,那么问题来了,在网站上创建用户的时候,要将用户同步到LDAP服务器上。看了一下python-ldap的文档,实现了对ldap服务器上的用户实现增删改查。


    
    
  1. import ldap
  2. from rest_framework.exceptions import APIException, ValidationError
  3. class MyLdap(object):
  4. def __init__(self, server_uri, server_port=389, bind_name=, bind_passwd=):
  5. self.server_uri = server_uri
  6. self.server_port = server_port
  7. self.ldap_obj = None
  8. self.ldap_connect(bind_name, bind_passwd)
  9. def ldap_connect(self, bind_name=, bind_passwd=):
  10. ”“”
  11. :param bind_name: 绑定的ldap用户,可为空; 添加,删除用户时 bind_name 要有root权限
  12. :param bind_passwd:
  13. :return:
  14. “”“
  15. url = self.server_uri + “:” + str(self.server_port)
  16. conn = ldap.initialize(url)
  17. # try:
  18. # conn.start_tls_s()
  19. # except ldap.LDAPError as exc:
  20. # raise APIException(exc.message)
  21. if bind_name and not bind_passwd:
  22. raise APIException( “请输入LDAP密码”)
  23. try:
  24. rest = conn.simple_bind_s(bind_name, bind_passwd)
  25. except ldap.SERVER_DOWN:
  26. raise APIException( “无法连接到LDAP”)
  27. except ldap.INVALID_CREDENTIALS:
  28. raise APIException( “LDAP账号错误”)
  29. except Exception, ex:
  30. raise APIException(type(ex))
  31. if rest[ 0] != 97: # 97 表示success
  32. raise APIException(rest[ 1])
  33. self.ldap_obj = conn
  34. def ldap_search(self, base=, keyword=None, rdn=‘cn’):
  35. ”“”
  36. base: 域 ou=test, dc=test, dc=com
  37. keyword: 搜索的用户
  38. rdn: cn/uid
  39. “”“
  40. scope = ldap.SCOPE_SUBTREE
  41. filter = “%s=%s” % (rdn, keyword)
  42. retrieve_attributes = None
  43. try:
  44. result_id = self.ldap_obj.search(base, scope, filter, retrieve_attributes)
  45. result_type, result_data = self.ldap_obj.result(result_id)
  46. if not result_data:
  47. return False, []
  48. except ldap.LDAPError, error_message:
  49. raise APIException(error_message)
  50. return True, result_data
  51. def add_user(self, base_dn, password):
  52. ”“”
  53. base_dn: cn=test, ou=magicstack,dc=test,dc=com NOT NONE
  54. “”“
  55. if not base_dn:
  56. raise ValidationError( u”DN不能为空”)
  57. dn_list = base_dn.split( ‘,’)
  58. user_info = dict()
  59. for item in dn_list:
  60. attr, value = item.split( ‘=’)
  61. if not value:
  62. raise ValidationError( u”DN输入错误:属性的值为空”)
  63. user_info[attr] = value
  64. add_record = [( ‘objectclass’, [ ‘person’, ‘organizationalperson’]),
  65. ( ‘cn’, [ ‘%s’ % user_info.get( “cn”)]),
  66. ( ‘sn’, [ ‘%s’ % user_info.get( “cn”)]),
  67. ( ‘userpassword’, [ ‘%s’ % password])]
  68. try:
  69. result = self.ldap_obj.add_s(base_dn, add_record)
  70. except ldap.LDAPError, error_message:
  71. raise APIException(error_message)
  72. else:
  73. if result[ 0] == 105:
  74. return True, []
  75. else:
  76. return False, result[ 1]
  77. def modify_user(self, dn, attr_list):
  78. ”“”
  79. MOD_ADD: 如果属性存在,这个属性可以有多个值,那么新值加进去,旧值保留
  80. MOD_DELETE :如果属性的值存在,值将被删除
  81. MOD_REPLACE :这个属性所有的旧值将会被删除,这个值被加进去
  82. dn: cn=test, ou=magicstack,dc=test, dc=com
  83. attr_list: [( ldap.MOD_REPLACE, ‘givenName’, ‘Francis’ ),
  84. ( ldap.MOD_ADD, ‘cn’, ‘Frank Bacon’ )
  85. ]
  86. “”“
  87. try:
  88. result = self.ldap_obj.modify_s(dn, attr_list)
  89. except ldap.LDAPError, error_message:
  90. raise APIException(error_message)
  91. else:
  92. if result[ 0] == 103:
  93. return True, []
  94. else:
  95. return False, result[ 1]
  96. def delete_user(self, dn):
  97. ”“”
  98. dn: cn=test, ou=magicstack,dc=test, dc=com
  99. “”“
  100. try:
  101. result = self.ldap_obj.delete_s(dn)
  102. except ldap.LDAPError, error_message:
  103. raise APIException(error_message)
  104. else:
  105. if result[ 0] == 107:
  106. return True, []
  107. else:
  108. return False, result[ 1]


原地址

    最近项目中加入LDAP认证方式,那么问题来了,在网站上创建用户的时候,要将用户同步到LDAP服务器上。看了一下python-ldap的文档,实现了对ldap服务器上的用户实现增删改查。


  
  
  1. import ldap
  2. from rest_framework.exceptions import APIException, ValidationError
  3. class MyLdap(object):
  4. def __init__(self, server_uri, server_port=389, bind_name=, bind_passwd=):
  5. self.server_uri = server_uri
  6. self.server_port = server_port
  7. self.ldap_obj = None
  8. self.ldap_connect(bind_name, bind_passwd)
  9. def ldap_connect(self, bind_name=, bind_passwd=):
  10. ”“”
  11. :param bind_name: 绑定的ldap用户,可为空; 添加,删除用户时 bind_name 要有root权限
  12. :param bind_passwd:
  13. :return:
  14. “”“
  15. url = self.server_uri + “:” + str(self.server_port)
  16. conn = ldap.initialize(url)
  17. # try:
  18. # conn.start_tls_s()
  19. # except ldap.LDAPError as exc:
  20. # raise APIException(exc.message)
  21. if bind_name and not bind_passwd:
  22. raise APIException( “请输入LDAP密码”)
  23. try:
  24. rest = conn.simple_bind_s(bind_name, bind_passwd)
  25. except ldap.SERVER_DOWN:
  26. raise APIException( “无法连接到LDAP”)
  27. except ldap.INVALID_CREDENTIALS:
  28. raise APIException( “LDAP账号错误”)
  29. except Exception, ex:
  30. raise APIException(type(ex))
  31. if rest[ 0] != 97: # 97 表示success
  32. raise APIException(rest[ 1])
  33. self.ldap_obj = conn
  34. def ldap_search(self, base=, keyword=None, rdn=‘cn’):
  35. ”“”
  36. base: 域 ou=test, dc=test, dc=com
  37. keyword: 搜索的用户
  38. rdn: cn/uid
  39. “”“
  40. scope = ldap.SCOPE_SUBTREE
  41. filter = “%s=%s” % (rdn, keyword)
  42. retrieve_attributes = None
  43. try:
  44. result_id = self.ldap_obj.search(base, scope, filter, retrieve_attributes)
  45. result_type, result_data = self.ldap_obj.result(result_id)
  46. if not result_data:
  47. return False, []
  48. except ldap.LDAPError, error_message:
  49. raise APIException(error_message)
  50. return True, result_data
  51. def add_user(self, base_dn, password):
  52. ”“”
  53. base_dn: cn=test, ou=magicstack,dc=test,dc=com NOT NONE
  54. “”“
  55. if not base_dn:
  56. raise ValidationError( u”DN不能为空”)
  57. dn_list = base_dn.split( ‘,’)
  58. user_info = dict()
  59. for item in dn_list:
  60. attr, value = item.split( ‘=’)
  61. if not value:
  62. raise ValidationError( u”DN输入错误:属性的值为空”)
  63. user_info[attr] = value
  64. add_record = [( ‘objectclass’, [ ‘person’, ‘organizationalperson’]),
  65. ( ‘cn’, [ ‘%s’ % user_info.get( “cn”)]),
  66. ( ‘sn’, [ ‘%s’ % user_info.get( “cn”)]),
  67. ( ‘userpassword’, [ ‘%s’ % password])]
  68. try:
  69. result = self.ldap_obj.add_s(base_dn, add_record)
  70. except ldap.LDAPError, error_message:
  71. raise APIException(error_message)
  72. else:
  73. if result[ 0] == 105:
  74. return True, []
  75. else:
  76. return False, result[ 1]
  77. def modify_user(self, dn, attr_list):
  78. ”“”
  79. MOD_ADD: 如果属性存在,这个属性可以有多个值,那么新值加进去,旧值保留
  80. MOD_DELETE :如果属性的值存在,值将被删除
  81. MOD_REPLACE :这个属性所有的旧值将会被删除,这个值被加进去
  82. dn: cn=test, ou=magicstack,dc=test, dc=com
  83. attr_list: [( ldap.MOD_REPLACE, ‘givenName’, ‘Francis’ ),
  84. ( ldap.MOD_ADD, ‘cn’, ‘Frank Bacon’ )
  85. ]
  86. “”“
  87. try:
  88. result = self.ldap_obj.modify_s(dn, attr_list)
  89. except ldap.LDAPError, error_message:
  90. raise APIException(error_message)
  91. else:
  92. if result[ 0] == 103:
  93. return True, []
  94. else:
  95. return False, result[ 1]
  96. def delete_user(self, dn):
  97. ”“”
  98. dn: cn=test, ou=magicstack,dc=test, dc=com
  99. “”“
  100. try:
  101. result = self.ldap_obj.delete_s(dn)
  102. except ldap.LDAPError, error_message:
  103. raise APIException(error_message)
  104. else:
  105. if result[ 0] == 107:
  106. return True, []
  107. else:
  108. return False, result[ 1]


猜你喜欢

转载自blog.csdn.net/baidu_33387365/article/details/80894051
今日推荐