LDAP身份验证用户的DRF模型权限失败

时间:2018-07-27 01:44:06

标签: python django django-rest-framework django-auth-ldap

我正在使用基于DRF的应用程序,需要LDAP身份验证。我遇到了一个问题,即对于直接通过DRF API登录的用户以及从外部应用程序(即Curl / Postman)访问它的用户,我看到了不同的行为。

在应用程序中,登录后,我将提供一系列用户可以访问的视图/ URL,即下面的用于查看“样本”的URL:

http://:8000 / api / samples

我已使用自定义权限类将DjangoModelPermissions应用于我的Sample视图,该视图需要模型权限才能查看模型,即:

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 的以下代码中确定了失败的原因,该代码实际上是在访问URL时从DRF中的视图调度程序调用的从内置的DRF API中,“ 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属性数据有关,还是能够在每个后续操作中检索到它。

0 个答案:

没有答案