【问题标题】:Customizing / extending / monkey patching Django Auth Backend自定义/扩展/猴子补丁 Django Auth Backend
【发布时间】:2023-03-27 04:45:01
【问题描述】:

我正在使用django-auth-ldap 连接到 LDAP 服务器进行身份验证。 django-auth-ldap 提供了AUTH_LDAP_REQUIRE_GROUP 设置,它可以用来只允许特定组中的用户访问。这很好用,但该选项只允许检查一组;我想检查用户是否被放置在一个或另一个组中。

在模块django_auth_ldap/backend.py 中,我可以修改LDAPUser(object) 类的方法_check_required_groups 来实现此行为。直接修改它可以正常工作,但由于更改源将导致维护地狱,我正在寻找一种解决方案来更改此方法而不接触源。我有两个想法:

1) 猴子补丁

更改LDAPUser 类实例的_check_required_groups 方法。问题是我不知道它在哪里实例化。我只是在设置文件中使用从django_auth_ldap.config 导入的LDAPSearchGroupOfNamesType,并将字符串django_auth_ldap.backend.LDAPBackend 传递给AUTHENTICATION_BACKENDS 元组。

2) 扩展模块

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

from django_auth_ldap import *

但是使用这个模块不起作用,因为它不能导入custom_auth.config

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

【问题讨论】:

    标签: python django monkeypatching extending


    【解决方案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 并使用它而不是 _LDAPUser

    查看代码here,发现LDAPBackend引用_LDAPUser的方法有authenticateget_userget_group_permissions。所以,LDAPBackendEx 的实现是这样的:

    class LDAPBackendEx(LDAPBackend):
        def authenticate(self, username, password):
            ldap_user = LDAPUserEx(self, username=username)
            user = ldap_user.authenticate(password)
            return user
    
       def get_user(self, user_id):
           pass # please put definition of get_user here changing _LDAPUser to LDAPUserEx
    
       def get_group_permissions(self, user):
           pass # please put definition of get_group_permissions here changing _LDAPUser to LDAPUserEx        
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-06
      • 2010-11-26
      • 1970-01-01
      • 2016-09-01
      • 2012-09-16
      • 2012-12-18
      • 2020-01-09
      • 1970-01-01
      相关资源
      最近更新 更多