【问题标题】:Django REST framework: Check user is in groupDjango REST框架:检查用户是否在组中
【发布时间】:2013-10-22 17:53:48
【问题描述】:

我想知道创建自定义权限以检查用户是否在特定组中的最佳方法。以前,我有一个装饰器,我可以在视图上使用它来传递一组组名和用户对象,然后检查该用户是否在指定的组中。

即:

def in_group_views(*group_names):
    """Requires user membership in at least one of the groups passed in."""

    def in_groups(u):
        if u.is_authenticated():
            if bool(u.groups.filter(name__in=group_names)) | u.is_superuser:
                return True
        return False

    return user_passes_test(in_groups)

考虑到我需要为不同的操作(POST、PUT、GET)等检查不同的组成员身份,我将如何为视图集的 DRF 执行此操作。

非常感谢, 本

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    参数化权限类的明智方法是将参数放在视图类上。这样您就可以在不同视图之间更改行为。

    这是一个例子:

    # permissions.py
    from django.contrib.auth.models import Group
    from rest_framework import permissions
    
    def is_in_group(user, group_name):
        """
        Takes a user and a group name, and returns `True` if the user is in that group.
        """
        try:
            return Group.objects.get(name=group_name).user_set.filter(id=user.id).exists()
        except Group.DoesNotExist:
            return None
    
    class HasGroupPermission(permissions.BasePermission):
        """
        Ensure user is in required groups.
        """
    
        def has_permission(self, request, view):
            # Get a mapping of methods -> required group.
            required_groups_mapping = getattr(view, "required_groups", {})
    
            # Determine the required groups for this particular request method.
            required_groups = required_groups_mapping.get(request.method, [])
    
            # Return True if the user has all the required groups or is staff.
            return all([is_in_group(request.user, group_name) if group_name != "__all__" else True for group_name in required_groups]) or (request.user and request.user.is_staff)
    

    然后您可以像这样使用HasGroupPermission 类:

    # views.py
    class MyView(APIView):
         permission_classes = [HasGroupPermission]
         required_groups = {
             'GET': ['moderators', 'members'],
             'POST': ['moderators', 'someMadeUpGroup'],
             'PUT': ['__all__'],
         }
    
         ...
    

    希望有帮助!

    【讨论】:

    • 感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2016-04-08
    • 2015-09-13
    相关资源
    最近更新 更多