我使用django-auth-ldap连接到LDAP服务器进行身份验证。 django-auth-ldap提供设置AUTH_LDAP_REQUIRE_GROUP
,可用于仅允许对位于特定组中的用户进行访问。这样可以正常工作,但该选项只允许检查一个组;我想检查用户是否被放置在一个或另一个组中。
在模块django_auth_ldap/backend.py
中,我可以修改类_check_required_groups
的方法LDAPUser(object)
来实现此行为。直接修改它可以正常工作,但由于更改源会最终导致维护地狱,我正在寻找一种解决方案来更改此方法而不会触及源。我有两个想法:
1)猴子补丁
更改_check_required_groups
类实例的LDAPUser
方法。问题是我不知道它在哪里被实例化。我只是在设置文件中使用从LDAPSearch
导入的GroupOfNamesType
和django_auth_ldap.config
,并将字符串django_auth_ldap.backend.LDAPBackend
传递到AUTHENTICATION_BACKENDS
元组。
2)扩展模块
创建一个自己的模块,扩展原始django_auth_ldap
并使用它而不是原始模块。我尝试创建一个新目录,添加__init__.py
行:
from django_auth_ldap import *
但是使用此模块不起作用,因为它无法导入custom_auth.config
。
任何其他建议或提示如何使其中一种尝试起作用?
答案 0 :(得分:1)
要成为模块化,DRY并且一般都遵循django哲学,您需要创建一个名为LDAPBackendEx
的类,该类将继承自LDAPBackend
并将此类用于AUTHENTICATION_BACKENDS
django_auth_ldap.backend.LDAPBackend
。此外,您还要创建一个LDAPUserEx
,它将从_LDAPUser
开始,并覆盖_check_required_groups
方法。
所以,LDAPUserEx
会是这样的:
class LDAPUserEx(_LDAPUser):
def _check_required_group(self):
pass # Put your implementation here !
现在,关于LDAPBackendEx
的实现:遗憾的是,无法定义自定义_LDAPUser
类,因此您必须搜索使用_LDAPUser
类的每个方法并覆盖它与LDAPUserEx
。实现django-auth-ldap的正确方法(如果我们实际上需要模块化)将是向LDAPBackend添加user_class
属性,将其初始化为_LDAPUser
并使用它而不是{{1} }}
检查代码here,我发现引用_LDAPUser
的{{1}}方法是LDAPBackend
,_LDAPUser
和authenticate
。因此,get_user
的实现将是这样的:
get_group_permissions