0

Contexte

Nous avons un service où un django super administrateur peut se connecter et afficher tous les utilisateurs dans une org spécifique, et ce super administrateur peut « se connecter » à la place de cet utilisateur. -À-dire supposons que nous avonsComment donner à un utilisateur une seule session autorisation supplémentaire dans Django

super admin = joe 
users = mike, abe, tony 

alors joe peut se connecter à un org, voir Mike, abe et tony, puis Joe peut se connecter dans le système comme si elles sont micro. Tout ce qu'ils verront et feront sera comme si Mike le faisait. Donc, si le super-administrateur a la permission de créer des événements publics, mais que mike ne le fait pas, quand le super-administrateur se connecte en tant que micro, il ne pourra pas non plus créer d'événements.

Jusqu'ici tout va bien.

Cependant, nous avons réalisé que dans de nombreux cas, nous aimerions que le super administrateur se connecte en tant que micro, et soit toujours reconnu comme un super administrateur dans le système. Ceci est utile pour la migration de données, c'est-à-dire que le super administrateur doit parfois faire des choses au nom de Mike que Mike ne peut pas faire lui-même.

Problème

l'idée est ici que je voudrais que le système reconnaisse que super administrateur est connecté en tant que micro. Cependant toutes les questions que j'ai vues en ligne (telles que this one) sont plus au sujet d'assigner des permissions permanentes (c.-à-d. En les stockant dans le DB), plutôt que temporaires/éphémères.

C'est le code qui est appelé lorsque l'internaute clique admin sur le bouton de connexion à côté mike:

class LoginAsView(APIView): 
    permission_classes = [] 

    def get(self, request, *args, **kwargs): 
     if request.user.is_superuser and 'username' in request.GET: 
      user = User.objects.get(email=request.GET['username']) 
      user.backend = settings.AUTHENTICATION_BACKENDS[0] 
      login(self.request, user) 
      return Response('/', 302, headers={'Location': '/'}) 
     raise PermissionDenied('NO U') 

afin que vous pouvez voir l'utilisateur je récupérer se comporte exactement comme si l'utilisateur (c.-à-micro) connecté organiquement. Je voudrais dans cette méthode assigner à Mike certaines permissions spéciales temporaires qui permettent à Mike de faire des choses qu'il ne peut normalement pas faire.

+0

Je suis arrivé à cette recommandation .. mais il semble comme une impasse en elle-même: "vous pouvez stocker un indicateur dans la session, et modifiez User.has_permission etc pour regarder la session aussi .. mais c'est difficile parce que ces fonctions n'ont pas accès à la demande. " – abbood

Répondre