django - 使用 LDAP 身份验证但使用 ModelBackend 授权

标签 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 服务器获取组成员资格,可以专门使用 LDAPBackend。但是,如果您想在 Django 中向单个用户分配权限或将用户添加到组中,则需要安装两个后端:

但我还是很困惑。这没有技术原因。当两个后端都激活并针对 LDAP 进行身份验证时,Django 仍然能够使用 Django 权限。

最佳答案

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

"The permissions given to the user will be the superset of all permissions returned by all backends. That is, Django grants a permission to a user that any one backend grants."

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 文件中。

关于django - 使用 LDAP 身份验证但使用 ModelBackend 授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26124434/

相关文章:

python - 使用一个模型中的变量并将其添加到 Django 中的表单中

python - Django 模型 "has more than one ForeignKey to "

encryption - KeyCloak 用户凭证加密

c# - 优化AD搜索-获取群组成员

java - 通过java检查Ldap服务器中的用户名和密码

python - Django - 避免编写重复代码

python - 如何在 django 启动时启动 redis 队列工作程序?

c# - AuthenticationTypes.SecureSocketsLayer 和 AuthenticationTypes.Secure 之间有什么区别?

java - 如何使用 Spring 和 Ldap 将登录用户重定向到主页

python - 带有 'parser.compile_filter(tokens[2])' 的 Django 自定义模板标签不起作用