2017-06-10 5 views
0

Ich möchte einigen Benutzern den Zugriff gewähren, einige Benutzer aktualisieren den Zugriff und keinen Zugriff auf nicht wiederhergestellte Benutzer für meine DRF-API.
In meinem erweiterten Benutzermodell gibt es zwei Felder, die festlegen, ob ein Benutzer die API abrufen oder aktualisieren darf. Wie sollte ich die Logik in meine benutzerdefinierte DRF-Berechtigungsklasse schreiben, um diese beiden Felder zu überprüfen und abhängig von True oder False Abrufen oder Aktualisieren zu gewähren? Soll ich dafür ein ViewSet verwenden oder separate ListAPIView-, RetrieveAPIView- und UpdateAPIView-Klassen mit Mixins verwenden? Was ist der beste Weg, dies zu tun?Django - Wie gewähren Sie bestimmten Benutzern in DRF benutzerdefinierte Berechtigungen?

models.py

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    allowRetrieveAPI = models.BooleanField(default=False,) 
    allowUpdateAPI = models.BooleanField(default=False,) 

class Track(models.Model):  
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL, verbose_name="Submitted by", default=1) 
    artist = models.CharField(max_length=100,) 
    title = models.CharField(max_length=100,) 

views.py

class CheckAPIPermissions(permissions.BasePermission): 
    # allow retrieve if userprofile.allowReadAPI is True 
    # allow update if user userprofile.allowUpdateAPI is True 

    def has_permission(self, request, view): 
     # return something 
    def check_object_permission(self, user, obj): 
     # return something  
    def has_object_permission(self, request, view, obj): 
     # return something 

class TrackViewSet(viewsets.ModelViewSet): 
    queryset = Track.objects.all() 
    serializer_class = TrackSerializer 
    permission_classes = (CheckAPIPermissions,) 
+0

Jeder kann auf die Listenmethode zugreifen, dann? – zaidfazil

+0

Ich habe das vergessen, aber wenn sie in der Lage sind, abzurufen, sollte ihnen die Listenmethode erlaubt sein. – bayman

Antwort

1
class CheckAPIPermissions(permissions.BasePermission): 
    # allow retrieve if userprofile.allowReadAPI is True 
    # allow update if user userprofile.allowUpdateAPI is True 

    def has_permission(self, request, view): 
     if request.user.is_superuser: 
      return True 
     elif request.user and request.user.is_authenticated(): 
      if (request.user.userprofile.allowRetrieveAPI or request.user.userprofile.allowUpdateAPI) and view.action == 'retrieve': 
       return True 
      elif request.user.userprofile.allowUpdateAPI and view.action == 'update': 
       return True 
     return False 

    def check_object_permission(self, user, obj): 
     return (user and user.is_authenticated() and (user.is_staff or obj == user)) 


    def has_object_permission(self, request, view, obj): 
     if request.user.is_superuser: 
      return True 
     elif request.user and request.user.is_authenticated(): 
      if (request.user.userprofile.allowRetrieveAPI or request.user.userprofile.allowUpdateAPI) and view.action == 'retrieve': 
       return request.user == obj 
      elif request.user.userprofile.allowUpdateAPI and view.action == 'update': 
       return request.user == obj 
     return False 

ich es nicht getestet haben, schrieb nur in einem Einschnitt der Zeit.

Verwandte Themen