使用LDAP身份验证但ModelBackend授权

时间:2014-09-30 15:19:43

标签: django ldap

我一直在研究针对LDAP进行身份验证的Django应用。我在管理界面中创建了权限和组。在开发模式中,我有两个后端活动

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服务器绘制组成员资格来独占使用它。但是,如果您想为各个用户分配权限或将用户添加到Django中的组,则需要安装两个后端:

但我仍然感到困惑。这没有技术上的原因。当两个后端都被激活并对LDAP进行身份验证时,Django仍然可以使用Django权限。

1 个答案:

答案 0 :(得分:1)

这是很久以前的问题,所以我希望你找到答案......但是要帮助其他可能偶然发现的人:

  

"给予用户的权限将是所有后端返回的所有权限的超集。也就是说,Django向用户授予任何一个后端授予的权限。"

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

这意味着它正在通过并检查所有后端中的所有权限/ perms方法,即使您使用LDAPBackend进行了身份验证,Django也会从LDAPBackend + ModelBackend中提取权限/权限并将它们全部组合在一起。

如果你真的想要确实从未调用过ModelBackend.authenticate(),你可以随时让自己的类MyAuth(ModelBackend)继承自ModelBackend并覆盖其中的authenticate,以便始终返回None。然后你将它包含在settings.py文件中。