定制/扩展/猴子修补Django Auth后端

时间:2014-01-20 13:55:55

标签: python django monkeypatching extending

我使用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导入的GroupOfNamesTypedjango_auth_ldap.config,并将字符串django_auth_ldap.backend.LDAPBackend传递到AUTHENTICATION_BACKENDS元组。

2)扩展模块

创建一个自己的模块,扩展原始django_auth_ldap并使用它而不是原始模块。我尝试创建一个新目录,添加__init__.py行:

from django_auth_ldap import *

但是使用此模块不起作用,因为它无法导入custom_auth.config

任何其他建议或提示如何使其中一种尝试起作用?

1 个答案:

答案 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_LDAPUserauthenticate。因此,get_user的实现将是这样的:

get_group_permissions