Je veux avoir un moyen facile de vérifier si quelqu'un est propriétaire ou administrateur de post
, proposal
et ainsi de suite, il essaie d'éditer \ delete.Django (drf) autorisations dynamiques de BasePermission
Donc, chaque fois que j'utilise IsAuthenticated
permission et dans la méthode de ModelViewSet
je reçois par exemple et vérifier si instance.author
ou parfois est l'utilisateur qui l'a demandé (request.user == instance.owner
sur certains objets c'est request.user == instance.author
).
Question
La principale question est: comment puis-je créer la classe d'autorisation qui peut vérifier ce genre de propriété avec le nom d'attribut utilisateur dynamique par exemple?
L'une des solutions mines (pas le meilleur, je pense)
J'ai fonction créée qui prennent le nom d'instance d'attribut utilisateur retourne la classe d'autorisation:
def is_owner_or_admin_permission_factory(owner_prop_name):
class IsOwnerOrAdmin(BasePermission):
def has_permission(self, request, view, *args, **kwargs):
instance = view.get_object()
try:
owner = getattr(instance, owner_prop_name)
except AttributeError:
return False
return (
request.user and request.user.id and (owner == request.user or request.user.is_staff)
)
return IsOwnerOrAdmin
C'est le travail pour moi parfaitement! Merci encore! – Dionid
Un moment: quand vous vérifiez 'request.user.is_superuser' et ses retours' True', il sera retourné par la méthode, s'il est 'False' et le second argument déclenche une exception, vous pouvez simplement retourner' False', car 'request .user.is_superuser' doit déjà être 'False'. – Dionid
Aussi, je pense qu'il est préférable de vérifier que l'utilisateur est autorisé, car (dans la plupart des cas) 'AnonymousUser' ne peut pas être propriétaire de l'objet, il doit donc être autorisé. – Dionid