2014-09-30 41 views
1

我一直在研究一個針對LDAP進行身份驗證的Django應用程序。我在管理界面中創建了權限和組。在開發模式下,我的兩個後端都處於活動狀態使用LDAP身份驗證但ModelBackend授權

AUTHENTICATION_BACKENDS = (
    'django_auth_ldap.backend.LDAPBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

Django嘗試在其所有身份驗證後端進行身份驗證。無論成功如何,它都會使用授予用戶的ModelBackend授權(權限和組)。

但是,當禁用'django.contrib.auth.backends.ModelBackend'Django不使用標準的授權方法。在生產環境中,我希望用戶僅針對LDAP進行身份驗證。

我的問題:

是否有禁用ModelBackend授權,但仍然使用ModelBackend授權的選項。

編輯

首先說明在docs of django-auth-ldap

注意LDAPBackend不從ModelBackend繼承。可以通過將LDAPBackend配置爲從LDAP服務器繪製組成員資格來使用LDAPBackend。但是,如果您想爲單個用戶分配權限或將用戶添加到Django中的組中,則需要安裝兩個後端:

但我仍然感到困惑。這沒有任何技術上的原因。當兩個後端都激活並通過LDAP進行身份驗證時,Django仍然可以使用Django權限。

回答

1

這是問前一段,所以我希望你找到了答案......而是要幫助別人誰可能跨越此絆倒:

「提供給用戶的權限將是超的所有後端返回的所有權限,也就是說,Django向用戶授予任何後端授予的權限。「

https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#handling-authorization-in-custom-backends

這意味着,它是通過下降,檢查所有的後端的所有權限/燙髮方法,即使你已被認證使用LDAPBackend,Django是拉動權限/從LDAPBackend + ModelBackend燙髮並將它們組合在一起。

如果您真的很想要確定ModelBackend.authenticate()永遠不會被調用,您可以始終讓自己的類MyAuth(ModelBackend)繼承自ModelBackend並重寫身份驗證,以便始終返回None。然後你會在你的settings.py文件中包含這個。