Question

De l'admin je vois que vous pouvez attribuer des autorisations à un utilisateur ou un groupe d'utilisateurs. Permettent, de modifier ou de suppression des données à partir d'un modèle

C'est grand, mais je dois aussi permettre à un utilisateur ou un groupe d'utilisateurs d'accéder ou non un groupe de vues. J'ai certain type de services sur mon site web, donc je veux permettre à certains utilisateurs d'accéder à un certains services (pages / vues), mais pas d'autres.

Alors, comment puis-je permettre à certains utilisateurs / groupes d'utilisateurs l'accès à certains points de vue? Je vous remercie!

Était-ce utile?

La solution

Les utilisateurs qui ne peuvent pas ajouter ou modifier un certain modèle, etc., ne seront pas en mesure de le voir dans l'admin.

Si nous parlons de votre point de vue créé personnalisés alors vous pouvez créer quelque chose qui vérifie un utilisateur pour une autorisation et renvoie une 404 si elles n'ont pas l'autorisation. Les autorisations sont liées aux modèles et un groupe peuvent être attribués diverses autorisations.

Vous pouvez ajouter une autorisation à un modèle comme celui-ci:

# myproject/myapp/models.py

class MyModel(models.Model):
    class Meta:
        permissions = (
            ('permission_code', 'Friendly permission description'),
        )

Ensuite, vous pouvez vérifier si un utilisateur a la permission comme ceci:

@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
    # ...

Utilisation d'autorisations vous pouvez facilement ajouter ou les retirer de simplement les utilisateurs et les groupes à l'aide de l'interface d'administration.

Autres conseils

Vous devez gérer cette main, mais il est assez facile. On peut supposer qu'il ya un attribut qui détermine si oui ou non un groupe a la permission de voir une vue: vous décorer ce point de vue soit avec le décorateur permission_required, si elle est une simple question de savoir si l'utilisateur dispose d'une autorisation particulière ou user_passes_test si elle est un peu plus compliqué:

@user_passes_test(lambda u: u.is_allowed_to_see_view_myview())
def myview(request):
    ...etc...

en supposant que is_allowed_to_see_view_myview est une sorte de méthode sur l'objet utilisateur.

docs d'authentification sont assez complets.

Pour les vues à base de classe, vous pouvez hériter classe UserPassesTestMixin dans la vue et de définir test_func

from django.contrib.auth.mixins import UserPassesTestMixin

class MainView(UserPassesTestMixin, View):

    def test_func(self):
        return self.request.user.has_perm('app.get_main_view')

Jetez un oeil à ce docs pour plus de détails sur la façon d'utiliser ceci:

système d'autorisations est un modèle centré sur et suppose que les autorisations sont liées aux modèles. Je pense que la suite 2 alternatives sont meilleures options:

A. Si vos points de vue sont liés à un modèle spécifique, autorisations utilisation personnalisées sur ce modèle comme Marcus Whybrow suggéré.

B. [Non testé, pourrait ne pas fonctionner] Subclasss User et y définir vos propres autorisations. Vous n'avez pas besoin modèle réel, il est juste wrapper pour l'autorisation personnalisée de votre application:

from django.contrib.auth.models import User
class MyUser(User):
    class Meta:
        permissions = (('can_visit_$viewset1', 'Can visit $view_set_1'))

Ne pas oublier d'exécuter syncdb pour ajouter des autorisations personnalisées à la base de données.

Si vous utilisez Django 1.9+, vous devriez être en mesure d'utiliser PermissionRequiredMixin: https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.mixins.PermissionRequiredMixin

Par exemple:

from django.contrib.auth.mixins import PermissionRequiredMixin

class MainView(PermissionRequiredMixin, View):
    permission_required = 'my_services.foo_bar'
    ...

Il est en fait un cas particulier de UserPassesTestMixin, conçu spécifiquement pour vérifier si l'utilisateur a l'autorisation indiquée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top