2013-10-15 5 views
15

Ich frage mich, die beste Möglichkeit zum Erstellen einer benutzerdefinierten Berechtigung, die überprüft, ob ein Benutzer in einer bestimmten Gruppe ist. Zuvor hatte ich einen Dekorator, den ich in einer Ansicht verwenden konnte, um ein Tupel von Gruppennamen zusammen mit dem Benutzerobjekt zu übergeben und dann zu überprüfen, ob dieser Benutzer in den angegebenen Gruppen war.Django REST-Framework: Überprüfen Sie Benutzer in Gruppe

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) 

Wie würde ich tun dies für DRF für eine Viewset unter Berücksichtigung ich für verschiedene Gruppenmitgliedschaften für verschiedene Aktionen überprüfen müssen (POST, PUT, GET) usw.

Vielen Dank, Ben

Antwort

32

Die sinnvolle Möglichkeit, Berechtigungsklassen zu parametrisieren, besteht darin, die Parameter auf die View-Klasse zu setzen. Dadurch können Sie das Verhalten von Ansicht zu Ansicht ändern.

Hier ist ein Beispiel:

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

    ... 

Hoffnung, die hilft:

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]) 

Sie dann die HasGroupPermission Klasse wie so verwenden könnte!

+2

Sie Herr sind ein Gentleman und ein Gelehrter, vielen Dank! –

+0

Gern geschehen. –

+0

Danke für Ihre Hilfe –