一个使用ldap3作为后端以实现跨平台兼容性的python/django Active Directory群组管理抽象。
项目描述
=============================
ldap-groups
=============================
一个使用ldap3作为后端以实现跨平台兼容性的python/django Active Directory群组管理抽象。
徽章
------
.. image:: https://img.shields.io/travis/kavdev/ldap-groups/master.svg?style=flat-square
:target: https://travis-ci.org/kavdev/ldap-groups
.. image:: https://img.shields.io/codecov/c/github/kavdev/ldap-groups/master.svg?style=flat-square
:target: http://codecov.io/github/kavdev/ldap-groups?branch=master
.. image:: https://img.shields.io/requires/github/kavdev/ldap-groups.svg?style=flat-square
:target: https://requires.io/github/kavdev/ldap-groups/requirements/?branch=master
.. image:: https://img.shields.io/codacy/f8b8c71b805e4585b8c34ba7c02fbd0c.svg?style=flat-square
:target: https://www.codacy.com/app/kavdev/ldap-groups/dashboard
.. image:: https://img.shields.io/pypi/v/ldap-groups.svg?style=flat-square
:target: https://pypi.python.org/pypi/ldap-groups
.. image:: https://img.shields.io/pypi/dw/ldap-groups.svg?style=flat-square
:target: https://pypi.python.org/pypi/ldap-groups
.. image:: https://img.shields.io/github/issues/kavdev/ldap-groups.svg?style=flat-square
:target: https://github.com/kavdev/ldap-groups/issues
.. image:: https://img.shields.io/github/license/kavdev/ldap-groups.svg?style=flat-square
:target: https://github.com/kavdev/ldap-groups/blob/master/LICENSE
安装
-----
使用pip安装ldap-groups
.. code-block:: bash
pip安装ldap-groups
将ldap-groups添加到``INSTALLED_APPS``(如果您使用的是Django)
.. 代码块:: python
INSTALLED_APPS = (
...
'ldap_groups',
...
)
django设置
---------------
在ldap-groups运行之前,必须配置一些设置。
**必填**
** ``LDAP_GROUPS_SERVER_URI`` - ldap服务器的uri,例如 'ldap://example.com'
** ``LDAP_GROUPS_BASE_DN`` - 基础搜索dn,例如 'DC=example,DC=com'
**可选**
** ``LDAP_GROUPS_BIND_DN`` - 绑定用户的DN
** ``LDAP_GROUPS_BIND_PASSWORD`` - 绑定用户的密码
注意:虽然绑定用户是可选的,但许多服务器的安全设置将拒绝匿名访问。
** ``LDAP_GROUPS_USER_LOOKUP_ATTRIBUTE`` - 查找用户时搜索的属性(应该是唯一的)。默认为 ``'sAMAccountName'``。
** ``LDAP_GROUPS_USER_SEARCH_BASE_DN`` - 查找用户时使用的base dn。默认为 ``LDAP_GROUPS_BASE_DN``。
** ``LDAP_GROUPS_GROUP_LOOKUP_ATTRIBUTE`` - 查找组时搜索的属性(应该是唯一的)。默认为 ``'name'``。
** ``LDAP_GROUPS_GROUP_SEARCH_BASE_DN`` - 查找组时使用的base dn。默认为 ``LDAP_GROUPS_BASE_DN``。
** ``LDAP_GROUPS_ATTRIBUTE_LIST`` - 在获取组成员时返回的属性列表。一个空列表应返回所有属性。默认为 ``['displayName', 'sAMAccountName', 'distinguishedName']``。
用法
-----
在其当前状态下,ldap-groups可以执行以下功能
**获取组的特定属性**
**以字典形式获取组的所有属性**
**获取组的所有成员及其属性(用户)**
**将成员添加到组(用户)**
**从组中移除成员(用户)**
**将子组添加到组(嵌套组)**
**从组中移除子组(嵌套组)**
**获取组的所有后代(组和组织单位)**
**获取组的所有子代(组和组织单位)**
**遍历到组的特定子代**
**遍历到组的父代**
**遍历到组的祖先**
ADGroup实例仅需要一个参数即可运行:组的区分名。
一旦ADGroup实例化,其余的就相对简单
.. 代码块:: python
from ldap_groups import ADGroup
GROUP_DN = "ou=users,dc=example,dc=com"
ACCOUNT_NAME = "jdoe"
NAME_ATTRIBUTE = "name"
TYPE_ATTRIBUTE = "objectClass"
class ADGroupModifier(object)
def __init__(self)
self.ad_group_instance = ADGroup(GROUP_DN)
def add_member(self)
self.ad_group_instance.add_member(ACCOUNT_NAME)
def remove_member(self)
self.ad_group_instance.remove_member(ACCOUNT_NAME)
def get_group_member_info(self)
return self.ad_group_instance.get_member_info()
class ADGroupInfo(object)
def __init__(self)
self.ad_group_instance = ADGroup(GROUP_DN)
def get_attributes(self)
return self.ad_group_instance.get_attributes()
def get_name(self)
return self.ad_group_instance.get_attribute(NAME_ATTRIBUTE)
def get_type(self)
return self.ad_group_instance.get_attribute(TYPE_ATTRIBUTE)
文档
-------------
.. 代码块:: python
def get_attribute(attribute_name, no_cache=False)
""" 获取此组的传递属性。
:param attribute_name: 要获取的属性的名称。
:type attribute_name: str
:param no_cache (可选): 设置为True以直接从LDAP搜索中获取属性,而不是从缓存中获取。默认为False。
:type no_cache: boolean
:returns: 请求的属性或如果属性未设置则返回None。
"""
def get_attributes(no_cache=False)
""" 返回此组属性的字典。此方法在第一次搜索后将属性缓存,除非指定了no_cache。
:param no_cache (可选): 设置为True以直接从LDAP搜索中获取属性,而不是从缓存中获取。默认为False
:type no_cache: boolean
"""
def _get_group_members(page_size=500)
""" 搜索组并检索其成员。
参数:page_size(可选):许多服务器对可以返回的结果数量有限制。分页搜索绕过此限制。调整page_size以低于服务器的大小限制。(默认:500)
类型:page_size: int
"""
def get_member_info(page_size=500)
""" 从AD组对象检索成员信息。
参数:page_size(可选):许多服务器对可以返回的结果数量有限制。分页搜索绕过此限制。调整page_size以低于服务器的大小限制。(默认:500)
类型:page_size: int
:返回:根据LDAP_GROUPS_ATTRIBUTE_LIST设置或attr_list参数返回的AD组成员信息的字典。
"""
def get_tree_members()
""" 从树的此节点检索所有成员。
def add_member(user_lookup_attribute_value)
""" 尝试将成员添加到AD组。
:参数 user_lookup_attribute_value:LDAP_GROUPS_USER_LOOKUP_ATTRIBUTE的值。
:类型 user_lookup_attribute_value: str
:引发:如果提供的帐户在活动目录中不存在,则**AccountDoesNotExist**。(从_get_user_dn继承)
:引发:如果帐户已存在于该组中,则**EntryAlreadyExists**(ModificationFailed的子类)
:引发:如果绑定用户没有修改此组的权限,则**InsufficientPermissions**(ModificationFailed的子类)
:引发:如果由于不可预见的原因无法执行修改,则**ModificationFailed**。
"""
def remove_member(user_lookup_attribute_value)
""" 尝试从AD组中删除成员。
:参数 user_lookup_attribute_value:LDAP_GROUPS_USER_LOOKUP_ATTRIBUTE的值。
:类型 user_lookup_attribute_value: str
:引发:如果提供的帐户在活动目录中不存在,则**AccountDoesNotExist**。(从_get_user_dn继承)
:引发:如果绑定用户没有修改此组的权限,则**InsufficientPermissions**(ModificationFailed的子类)
:引发:如果由于不可预见的原因无法执行修改,则**ModificationFailed**。
"""
def add_child(group_lookup_attribute_value)
""" 尝试将子级添加到AD组。
:参数 group_lookup_attribute_value:LDAP_GROUPS_GROUP_LOOKUP_ATTRIBUTE的值。
:类型 group_lookup_attribute_value: str
:引发:如果提供的组在活动目录中不存在,则**GroupDoesNotExist**。(从_get_group_dn继承)
:引发:如果子级已存在于该组中,则**EntryAlreadyExists**(ModificationFailed的子类)
:引发:如果绑定用户没有修改此组的权限,则**InsufficientPermissions**(ModificationFailed的子类)
:引发:如果由于不可预见的原因无法执行修改,则**ModificationFailed**。
"""
def remove_child(group_lookup_attribute_value)
""" 尝试从AD组中删除子级。
:参数 group_lookup_attribute_value:LDAP_GROUPS_GROUP_LOOKUP_ATTRIBUTE的值。
:类型 group_lookup_attribute_value: str
:引发:如果提供的组在活动目录中不存在,则**GroupDoesNotExist**。(从_get_group_dn继承)
:引发:如果子级已存在于该组中,则**EntryAlreadyExists**(ModificationFailed的子类)
:引发:如果绑定用户没有修改此组的权限,则**InsufficientPermissions**(ModificationFailed的子类)
:引发:如果由于不可预见的原因无法执行修改,则**ModificationFailed**。
"""
def get_descendants(page_size=500)
""" 返回该组的所有后代的列表。
参数:page_size(可选):许多服务器对可以返回的结果数量有限制。分页搜索绕过此限制。调整page_size以低于服务器的大小限制。(默认:500)
类型:page_size: int
"""
def get_children(page_size=500)
""" 返回该组的子级列表。
参数:page_size(可选):许多服务器对可以返回的结果数量有限制。分页搜索绕过此限制。调整page_size以低于服务器的大小限制。(默认:500)
类型:page_size: int
"""
def child(group_name, page_size=500)
""" 返回与提供的group_name匹配的子ad组,如果子级不存在,则返回none。
:参数 group_name:子组的名称。注意:名称不包含'CN='或'OU='
:类型 group_name: str
参数:page_size(可选):许多服务器对可以返回的结果数量有限制。分页搜索绕过此限制。调整page_size以低于服务器的大小限制。(默认:500)
类型:page_size: int
"""
def parent()
""" 返回此组的父级(直到DC)
def ancestor(generation)
""" 给定一代,返回此组的祖先(直到DC)。
:参数 generation:确定要走的路径有多远。例如:0 = self,1 = parent,2 = grandparent ...
:类型 generation: int
"""
在不使用Django的情况下运行ldap-groups
----------------------------------
如果ldap-groups未用于django项目,则可以使用以下参数初始化ADGroup对象
.. 代码块:: python
ADGroup(group_dn, server_uri, base_dn[, user_lookup_attr[, group_lookup_attr[, attr_list[, bind_dn, bind_password[, user_search_base_dn[, group_search_base_dn]]]]]])
* ``group_dn`` - 要管理的组的确切名称。
* ``server_uri`` - ldap服务器的uri,例如'ldap://example.com'
* ``base_dn`` - 基础搜索dn,例如'DC=example,DC=com'
* ``user_lookup_attr`` - 查找用户时要搜索的属性(应该是唯一的)。默认为``'sAMAccountName'``。
* ``group_lookup_attr`` - 查找组时要搜索的属性(应该是唯一的)。默认为``'name'``。
* ``attr_list`` - 拉取组成员时返回的每个成员的属性列表。空列表应返回所有属性。默认为``['displayName', 'sAMAccountName', 'distinguishedName']``。
* ``bind_dn`` - 绑定用户的DN
* ``bind_password`` - 绑定用户的密码
* ``user_search_base_dn`` - 查找用户时要使用的base dn。默认为``LDAP_GROUPS_BASE_DN``。
* ``group_search_base_dn`` - 在查找组时使用的基DN。默认为 ``LDAP_GROUPS_BASE_DN``。
运行测试
------------------
.. code-block:: bash
pip install -r requirements/test.txt
./runtests.py
变更
=======
4.2.2 (2016-09-14)
------------------
* pep8 和项目结构更改
* 添加了对使用 ADGroup 作为上下文管理器的支持 #2
4.2.1 (2015-12-23)
------------------
* 当无法检索成员属性时,不再抛出 KeyError。现在返回 None。 (感谢 @willson556)
4.2.0 (2015-09-01)
------------------
* 添加了 get_tree_members 方法
4.1.1 (2015-08-28)
------------------
* 更新了依赖,修复了 escape_query 错误
4.1.0 (2015-03-25)
------------------
* 所有筛选查询现在都根据 LDAP 规范正确转义(除空字符外)
4.0.0 (2014-11-10)
------------------
* 添加了配置搜索基、按指定属性搜索用户/组的选项
* 添加了子添加/删除方法,重构了方法/类签名,添加了属性缓存,所有查找现在都是分页的
3.0.4 (2014-10-20)
------------------
* 错误修复,重构
3.0.3 (2014-10-13)
------------------
* 错误修复
3.0.2 (2014-10-08)
------------------
* 错误修复
3.0.1 (2014-10-08)
------------------
* 错误修复
3.0.0 (2014-10-03)
------------------
* 切换到 python3-ldap
2.5.3 (2014-09-15)
------------------
* 修复了子搜索,添加了自定义搜索函数
2.5.2 (2014-09-04)
------------------
* 修复了 Issue #2,修复了 readme 示例
2.5.1 (2014-08-31)
------------------
* 修复了 python-ldap 依赖限制(现在 >=)
2.5.0 (2014-08-30)
------------------
* 添加了组属性和树遍历方法
2.0.0 (2014-08-30)
------------------
* 移除了 django 依赖
1.0.1 (2013-09-05)
------------------
* 错误修复 - 不存在的用户也可以抛出 TypeError
1.0.0 (2013-08-26)
------------------
* 初次发布
ldap-groups
=============================
一个使用ldap3作为后端以实现跨平台兼容性的python/django Active Directory群组管理抽象。
徽章
------
.. image:: https://img.shields.io/travis/kavdev/ldap-groups/master.svg?style=flat-square
:target: https://travis-ci.org/kavdev/ldap-groups
.. image:: https://img.shields.io/codecov/c/github/kavdev/ldap-groups/master.svg?style=flat-square
:target: http://codecov.io/github/kavdev/ldap-groups?branch=master
.. image:: https://img.shields.io/requires/github/kavdev/ldap-groups.svg?style=flat-square
:target: https://requires.io/github/kavdev/ldap-groups/requirements/?branch=master
.. image:: https://img.shields.io/codacy/f8b8c71b805e4585b8c34ba7c02fbd0c.svg?style=flat-square
:target: https://www.codacy.com/app/kavdev/ldap-groups/dashboard
.. image:: https://img.shields.io/pypi/v/ldap-groups.svg?style=flat-square
:target: https://pypi.python.org/pypi/ldap-groups
.. image:: https://img.shields.io/pypi/dw/ldap-groups.svg?style=flat-square
:target: https://pypi.python.org/pypi/ldap-groups
.. image:: https://img.shields.io/github/issues/kavdev/ldap-groups.svg?style=flat-square
:target: https://github.com/kavdev/ldap-groups/issues
.. image:: https://img.shields.io/github/license/kavdev/ldap-groups.svg?style=flat-square
:target: https://github.com/kavdev/ldap-groups/blob/master/LICENSE
安装
-----
使用pip安装ldap-groups
.. code-block:: bash
pip安装ldap-groups
将ldap-groups添加到``INSTALLED_APPS``(如果您使用的是Django)
.. 代码块:: python
INSTALLED_APPS = (
...
'ldap_groups',
...
)
django设置
---------------
在ldap-groups运行之前,必须配置一些设置。
**必填**
** ``LDAP_GROUPS_SERVER_URI`` - ldap服务器的uri,例如 'ldap://example.com'
** ``LDAP_GROUPS_BASE_DN`` - 基础搜索dn,例如 'DC=example,DC=com'
**可选**
** ``LDAP_GROUPS_BIND_DN`` - 绑定用户的DN
** ``LDAP_GROUPS_BIND_PASSWORD`` - 绑定用户的密码
注意:虽然绑定用户是可选的,但许多服务器的安全设置将拒绝匿名访问。
** ``LDAP_GROUPS_USER_LOOKUP_ATTRIBUTE`` - 查找用户时搜索的属性(应该是唯一的)。默认为 ``'sAMAccountName'``。
** ``LDAP_GROUPS_USER_SEARCH_BASE_DN`` - 查找用户时使用的base dn。默认为 ``LDAP_GROUPS_BASE_DN``。
** ``LDAP_GROUPS_GROUP_LOOKUP_ATTRIBUTE`` - 查找组时搜索的属性(应该是唯一的)。默认为 ``'name'``。
** ``LDAP_GROUPS_GROUP_SEARCH_BASE_DN`` - 查找组时使用的base dn。默认为 ``LDAP_GROUPS_BASE_DN``。
** ``LDAP_GROUPS_ATTRIBUTE_LIST`` - 在获取组成员时返回的属性列表。一个空列表应返回所有属性。默认为 ``['displayName', 'sAMAccountName', 'distinguishedName']``。
用法
-----
在其当前状态下,ldap-groups可以执行以下功能
**获取组的特定属性**
**以字典形式获取组的所有属性**
**获取组的所有成员及其属性(用户)**
**将成员添加到组(用户)**
**从组中移除成员(用户)**
**将子组添加到组(嵌套组)**
**从组中移除子组(嵌套组)**
**获取组的所有后代(组和组织单位)**
**获取组的所有子代(组和组织单位)**
**遍历到组的特定子代**
**遍历到组的父代**
**遍历到组的祖先**
ADGroup实例仅需要一个参数即可运行:组的区分名。
一旦ADGroup实例化,其余的就相对简单
.. 代码块:: python
from ldap_groups import ADGroup
GROUP_DN = "ou=users,dc=example,dc=com"
ACCOUNT_NAME = "jdoe"
NAME_ATTRIBUTE = "name"
TYPE_ATTRIBUTE = "objectClass"
class ADGroupModifier(object)
def __init__(self)
self.ad_group_instance = ADGroup(GROUP_DN)
def add_member(self)
self.ad_group_instance.add_member(ACCOUNT_NAME)
def remove_member(self)
self.ad_group_instance.remove_member(ACCOUNT_NAME)
def get_group_member_info(self)
return self.ad_group_instance.get_member_info()
class ADGroupInfo(object)
def __init__(self)
self.ad_group_instance = ADGroup(GROUP_DN)
def get_attributes(self)
return self.ad_group_instance.get_attributes()
def get_name(self)
return self.ad_group_instance.get_attribute(NAME_ATTRIBUTE)
def get_type(self)
return self.ad_group_instance.get_attribute(TYPE_ATTRIBUTE)
文档
-------------
.. 代码块:: python
def get_attribute(attribute_name, no_cache=False)
""" 获取此组的传递属性。
:param attribute_name: 要获取的属性的名称。
:type attribute_name: str
:param no_cache (可选): 设置为True以直接从LDAP搜索中获取属性,而不是从缓存中获取。默认为False。
:type no_cache: boolean
:returns: 请求的属性或如果属性未设置则返回None。
"""
def get_attributes(no_cache=False)
""" 返回此组属性的字典。此方法在第一次搜索后将属性缓存,除非指定了no_cache。
:param no_cache (可选): 设置为True以直接从LDAP搜索中获取属性,而不是从缓存中获取。默认为False
:type no_cache: boolean
"""
def _get_group_members(page_size=500)
""" 搜索组并检索其成员。
参数:page_size(可选):许多服务器对可以返回的结果数量有限制。分页搜索绕过此限制。调整page_size以低于服务器的大小限制。(默认:500)
类型:page_size: int
"""
def get_member_info(page_size=500)
""" 从AD组对象检索成员信息。
参数:page_size(可选):许多服务器对可以返回的结果数量有限制。分页搜索绕过此限制。调整page_size以低于服务器的大小限制。(默认:500)
类型:page_size: int
:返回:根据LDAP_GROUPS_ATTRIBUTE_LIST设置或attr_list参数返回的AD组成员信息的字典。
"""
def get_tree_members()
""" 从树的此节点检索所有成员。
def add_member(user_lookup_attribute_value)
""" 尝试将成员添加到AD组。
:参数 user_lookup_attribute_value:LDAP_GROUPS_USER_LOOKUP_ATTRIBUTE的值。
:类型 user_lookup_attribute_value: str
:引发:如果提供的帐户在活动目录中不存在,则**AccountDoesNotExist**。(从_get_user_dn继承)
:引发:如果帐户已存在于该组中,则**EntryAlreadyExists**(ModificationFailed的子类)
:引发:如果绑定用户没有修改此组的权限,则**InsufficientPermissions**(ModificationFailed的子类)
:引发:如果由于不可预见的原因无法执行修改,则**ModificationFailed**。
"""
def remove_member(user_lookup_attribute_value)
""" 尝试从AD组中删除成员。
:参数 user_lookup_attribute_value:LDAP_GROUPS_USER_LOOKUP_ATTRIBUTE的值。
:类型 user_lookup_attribute_value: str
:引发:如果提供的帐户在活动目录中不存在,则**AccountDoesNotExist**。(从_get_user_dn继承)
:引发:如果绑定用户没有修改此组的权限,则**InsufficientPermissions**(ModificationFailed的子类)
:引发:如果由于不可预见的原因无法执行修改,则**ModificationFailed**。
"""
def add_child(group_lookup_attribute_value)
""" 尝试将子级添加到AD组。
:参数 group_lookup_attribute_value:LDAP_GROUPS_GROUP_LOOKUP_ATTRIBUTE的值。
:类型 group_lookup_attribute_value: str
:引发:如果提供的组在活动目录中不存在,则**GroupDoesNotExist**。(从_get_group_dn继承)
:引发:如果子级已存在于该组中,则**EntryAlreadyExists**(ModificationFailed的子类)
:引发:如果绑定用户没有修改此组的权限,则**InsufficientPermissions**(ModificationFailed的子类)
:引发:如果由于不可预见的原因无法执行修改,则**ModificationFailed**。
"""
def remove_child(group_lookup_attribute_value)
""" 尝试从AD组中删除子级。
:参数 group_lookup_attribute_value:LDAP_GROUPS_GROUP_LOOKUP_ATTRIBUTE的值。
:类型 group_lookup_attribute_value: str
:引发:如果提供的组在活动目录中不存在,则**GroupDoesNotExist**。(从_get_group_dn继承)
:引发:如果子级已存在于该组中,则**EntryAlreadyExists**(ModificationFailed的子类)
:引发:如果绑定用户没有修改此组的权限,则**InsufficientPermissions**(ModificationFailed的子类)
:引发:如果由于不可预见的原因无法执行修改,则**ModificationFailed**。
"""
def get_descendants(page_size=500)
""" 返回该组的所有后代的列表。
参数:page_size(可选):许多服务器对可以返回的结果数量有限制。分页搜索绕过此限制。调整page_size以低于服务器的大小限制。(默认:500)
类型:page_size: int
"""
def get_children(page_size=500)
""" 返回该组的子级列表。
参数:page_size(可选):许多服务器对可以返回的结果数量有限制。分页搜索绕过此限制。调整page_size以低于服务器的大小限制。(默认:500)
类型:page_size: int
"""
def child(group_name, page_size=500)
""" 返回与提供的group_name匹配的子ad组,如果子级不存在,则返回none。
:参数 group_name:子组的名称。注意:名称不包含'CN='或'OU='
:类型 group_name: str
参数:page_size(可选):许多服务器对可以返回的结果数量有限制。分页搜索绕过此限制。调整page_size以低于服务器的大小限制。(默认:500)
类型:page_size: int
"""
def parent()
""" 返回此组的父级(直到DC)
def ancestor(generation)
""" 给定一代,返回此组的祖先(直到DC)。
:参数 generation:确定要走的路径有多远。例如:0 = self,1 = parent,2 = grandparent ...
:类型 generation: int
"""
在不使用Django的情况下运行ldap-groups
----------------------------------
如果ldap-groups未用于django项目,则可以使用以下参数初始化ADGroup对象
.. 代码块:: python
ADGroup(group_dn, server_uri, base_dn[, user_lookup_attr[, group_lookup_attr[, attr_list[, bind_dn, bind_password[, user_search_base_dn[, group_search_base_dn]]]]]])
* ``group_dn`` - 要管理的组的确切名称。
* ``server_uri`` - ldap服务器的uri,例如'ldap://example.com'
* ``base_dn`` - 基础搜索dn,例如'DC=example,DC=com'
* ``user_lookup_attr`` - 查找用户时要搜索的属性(应该是唯一的)。默认为``'sAMAccountName'``。
* ``group_lookup_attr`` - 查找组时要搜索的属性(应该是唯一的)。默认为``'name'``。
* ``attr_list`` - 拉取组成员时返回的每个成员的属性列表。空列表应返回所有属性。默认为``['displayName', 'sAMAccountName', 'distinguishedName']``。
* ``bind_dn`` - 绑定用户的DN
* ``bind_password`` - 绑定用户的密码
* ``user_search_base_dn`` - 查找用户时要使用的base dn。默认为``LDAP_GROUPS_BASE_DN``。
* ``group_search_base_dn`` - 在查找组时使用的基DN。默认为 ``LDAP_GROUPS_BASE_DN``。
运行测试
------------------
.. code-block:: bash
pip install -r requirements/test.txt
./runtests.py
变更
=======
4.2.2 (2016-09-14)
------------------
* pep8 和项目结构更改
* 添加了对使用 ADGroup 作为上下文管理器的支持 #2
4.2.1 (2015-12-23)
------------------
* 当无法检索成员属性时,不再抛出 KeyError。现在返回 None。 (感谢 @willson556)
4.2.0 (2015-09-01)
------------------
* 添加了 get_tree_members 方法
4.1.1 (2015-08-28)
------------------
* 更新了依赖,修复了 escape_query 错误
4.1.0 (2015-03-25)
------------------
* 所有筛选查询现在都根据 LDAP 规范正确转义(除空字符外)
4.0.0 (2014-11-10)
------------------
* 添加了配置搜索基、按指定属性搜索用户/组的选项
* 添加了子添加/删除方法,重构了方法/类签名,添加了属性缓存,所有查找现在都是分页的
3.0.4 (2014-10-20)
------------------
* 错误修复,重构
3.0.3 (2014-10-13)
------------------
* 错误修复
3.0.2 (2014-10-08)
------------------
* 错误修复
3.0.1 (2014-10-08)
------------------
* 错误修复
3.0.0 (2014-10-03)
------------------
* 切换到 python3-ldap
2.5.3 (2014-09-15)
------------------
* 修复了子搜索,添加了自定义搜索函数
2.5.2 (2014-09-04)
------------------
* 修复了 Issue #2,修复了 readme 示例
2.5.1 (2014-08-31)
------------------
* 修复了 python-ldap 依赖限制(现在 >=)
2.5.0 (2014-08-30)
------------------
* 添加了组属性和树遍历方法
2.0.0 (2014-08-30)
------------------
* 移除了 django 依赖
1.0.1 (2013-09-05)
------------------
* 错误修复 - 不存在的用户也可以抛出 TypeError
1.0.0 (2013-08-26)
------------------
* 初次发布
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分布
ldap-groups-4.2.2.tar.gz (15.6 kB 查看哈希值)
构建分布
ldap_groups-4.2.2-py2.py3-none-any.whl (17.3 kB 查看哈希值)