我正在开发一个基于 DRF 的应用程序,需要 LDAP 身份验证。我遇到了一个问题,我看到直接通过 DRF API 登录的用户和从外部应用程序(即 Curl/Postman)访问它的用户的不同行为。
在应用程序中,一旦登录,我会提供一系列用户可以访问的视图/url,即下面的 url 以查看“示例”:
http://:8000/api/samples
我已经使用自定义权限类将 DjangoModelPermissions 应用于我的示例视图,该视图需要模型权限才能查看模型,即:
class HasModelPermission(permissions.DjangoModelPermissions):
perms_map = {
'GET': ['%(app_label)s.read_%(model_name)s'],
'OPTIONS': ['%(app_label)s.read_%(model_name)s'],
'HEAD': ['%(app_label)s.read_%(model_name)s'],
'POST': ['%(app_label)s.add_%(model_name)s'],
'PUT': ['%(app_label)s.change_%(model_name)s'],
'PATCH': ['%(app_label)s.change_%(model_name)s'],
'DELETE': ['%(app_label)s.delete_%(model_name)s'],
}
class SampleView(generics.ListAPIView):
queryset = Sample.objects.all()
serializer_class = SampleSerializer
permission_classes = [HasModelPermission]
根据https://django-auth-ldap.readthedocs.io/en/latest/permissions.html#group-mirroring,我已经使用 AUTH_LDAP_FIND_GROUP_PERMS=true 配置了我的 ldap 设置,并为我关心的 LDAP 组创建了匹配的 DJANGO 组关于 - 我已经为这些组分配了模型权限。这正如我所期望的那样工作 - 只有具有查看列表权限的组成员的用户才能看到它。
我看到的关键问题是,虽然内部 DRF API 正确确定用户权限,但外部登录然后提交 GET 请求的用户被确定为没有查看权限。
我通过一些调试确定原因是来自django_auth_ldap.backend.py的以下代码中的测试失败,该代码从DRF 中的视图调度程序调用,本质上,当我从 DRF API 中的内置访问 URL 时,“hasattr( user, 'ldap_user'):" 返回 true,当我通过邮递员或 curl 等连接时,"hasattr(user, 'ldap_user'):" 返回 false - 显然意味着没有确定存在用户权限。
def get_group_permissions(self, user, obj=None):
if not hasattr(user, 'ldap_user') and self.settings.AUTHORIZE_ALL_USERS:
_LDAPUser(self, user=user) # This sets user.ldap_user
if hasattr(user, 'ldap_user'):
permissions = user.ldap_user.get_group_permissions()
else:
permissions = set()
return permissions
所以我想最终我的问题是,我应该如何在来自远程端点的 HTTP 操作之间填充/维护 user.ldap_user 属性。(注意我使用的是会话和令牌认证 ATM)。我猜我的问题更多地与在操作之间维护用户 lda_user 属性数据有关,或者能够在每个连续操作中检索它。