2013-10-15 5 views
15

Zastanawiam się, jak najlepiej utworzyć niestandardowe uprawnienie, które sprawdza, czy użytkownik jest w określonej grupie. Poprzednio miałem dekorator, którego mogłem użyć w widoku, aby przekazać krotki nazw grup wraz z obiektem użytkownika, a następnie sprawdzić, czy ten użytkownik był w określonych grupach.Ramy Django REST: sprawdź, czy użytkownik należy do grupy

Ie:

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) 

Jak bym zrobił to dla DRF dla viewset, biorąc pod uwagę, muszę sprawdzić na różnych członkostwa grup dla różnych działań (POST, PUT, GET) itd

Wielkie dzięki, Ben

Odpowiedz

32

Rozsądnym sposobem parametryzowania klas uprawnień jest umieszczenie parametrów w klasie widoku. Pozwoli to zmienić zachowanie z widoku na widok.

Oto przykład:

def is_in_group(user, group_name): 
    """ 
    Takes a user and a group name, and returns `True` if the user is in that group. 
    """ 
    return Group.objects.get(name=group_name).user_set.filter(id=user.id).exists() 

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. 
     return all([is_in_group(request.user, group_name) for group_name in required_groups]) 

Następnie można użyć klasy HasGroupPermission tak:

class MyView(APIView): 
    permission_classes = [HasGroupPermission] 
    required_groups = { 
     'GET': ['moderators', 'members'], 
     'POST': ['moderators'], 
    } 

    ... 

nadzieję, że pomoże!

+2

Ty jesteś dżentelmenem i uczonym, wielkie dzięki! –

+0

Nie ma za co. –

+0

Dzięki za pomoc –