2014-01-20 47 views
0

我使用django-auth-ldap連接到LDAP服務器進行身份驗證。 django-auth-ldap提供設置AUTH_LDAP_REQUIRE_GROUP,該設置可用於僅允許放置在特定組中的用戶訪問。這工作正常,但該選項只允許檢查一個組;我想檢查一個用戶是否被放置在一個或另一個組中。定製/擴展/猴子補丁Django Auth後端

在模塊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

任何其他建議或提示如何使其中一個嘗試工作?

回答

1

是模塊化的,乾的,和真實的一般Django的理念,你需要創建一個名爲LDAPBackendEx類將從​​繼承和使用這個類你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實現:Unfortuanately沒有定義自定義_LDAPUser類的,所以你不得不尋找使用每個方法的方法_LDAPUser類,並用LDAPUserEx覆蓋它。實現django-auth-ldap(如果我們實際上需要模塊化)的正確方法是將user_class屬性添加到LDAPBackend,將其初始化爲_LDAPUser並使用該屬性代替_LDAPUser

檢查代碼here,我發現的​​引用的方法_LDAPUserauthenticateget_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