2016-07-13 4 views
3

Ich habe Django Standard "User" -Modell für neue Benutzer Typ Feld erweitert. Benutzertypkategorien sind Benutzer, admin und Betrachter. Und ich möchte implementieren RESTapi für diese mit tastypie und geben Sie die Erlaubnis, auf diese API basierend auf Benutzertyp zugreifen. zum Beispiel Admin-Benutzer haben vollen Zugriff auf diese API, Benutzer kann alle Felder anzeigen, kann aber nur ihr eigenes Konto, Viewer haben keinen Zugriff auf diese API.Wie GET, POST-Zugriff auf Ressourcen zu begrenzen mit benutzerdefinierten Typ in tastypie anpassen

api.py

class UserResource(ModelResource): 
     class Meta: 
      queryset = CustomUser.objects.all() 
      resource_name = 'user' 
      allowed_methods = ['get','post'] 
      filtering = {"id": ALL} 
      excludes = ['is_staff','password','is_superuser','id','is_active','date_joined'] 
      authentication = BasicAuthentication() 

Was ist der beste Weg, dies zu umgehen?

Antwort

0

Schreiben Sie zuerst Ihre eigene Authentifizierungsklasse. In dieser Klasse überprüfen Sie, ob der Benutzer Viewer ist. Wenn ja, gib Falsch zurück.

class MyAuthentication(BasicAuthentication): 
    def is_authenticated(self, request, **kwargs): 
     is_authenticated = super(MyAuthentication, self).is_authenticated(request, **kwargs) 
     if not is_authenticated: 
      return False 
     return request.user.user_type_category != 'viewer' 

Zweitens, schreiben Sie Ihre eigene Autorisierungsklasse. In dieser Klasse überschreiben Funktionen [create|update|delete]_[list|detail] und in erstellen/löschen Funktionen überprüfen, ob Benutzer Benutzer ist. Wenn ja, Ausnahme (in Details) auslösen oder [] (in Liste) zurückgeben. Überprüfen Sie im Update, ob sich der Benutzer selbst aktualisiert. Wenn nein, Ausnahme auslösen oder [] zurückgeben.

class MyAuthorization(DjangoAuthorization): 
    def create_detail(self, object_list, bundle): 
     super(MyAuthorization, self).create_detail(object_list, bundle) 
     if bundle.request.user.user_type_category != 'admin': 
      raise Unauthorized("You are not allowed to create that resource.") 
     return True 

    def create_list(self, object_list, bundle): 
     if bundle.request.user.user_type_category != 'admin': 
      return [] 
     return super(MyAuthorization, self).create_list(object_list, bundle) 

    def delete_detail(self, object_list, bundle): 
     super(MyAuthorization, self).delete_detail(object_list, bundle) 
     if bundle.request.user.user_type_category != 'admin': 
      raise Unauthorized("You are not allowed to delete that resource.") 
     return True 

    def delete_list(self, object_list, bundle): 
     if bundle.request.user.user_type_category != 'admin': 
      return [] 
     return super(MyAuthorization, self).delete_list(object_list, bundle) 

    def update_detail(self, object_list, bundle): 
     super(MyAuthorization, self).delete_detail(object_list, bundle) 
     if bundle.request.user != bundle.obj: 
      raise Unauthorized("You are not allowed to update that resource.") 
     return True 

    def update_list(self, object_list, bundle): 
     object_list = super(MyAuthorization, self).update_list(object_list, bundle) 
     if object_list.count() == object_list.filter(pk=bundle.obj.pk).count(): 
      return object_list 
     return [] 
Verwandte Themen