Frage

Aus dem Administrator sehe ich, dass Sie einem Benutzer oder einer Benutzergruppe Berechtigungen zuweisen können, um Daten hinzufügen, ändern oder löschen von einem Modell.

Das ist großartig, aber ich muss auch einem Benutzer oder einer Benutzergruppe erlauben, auf eine Gruppe von Ansichten zuzugreifen oder nicht. Ich habe bestimmte Art von Diensten auf meiner Website, daher möchte ich einigen Benutzern ermöglichen, auf bestimmte Dienste (Seiten/Ansichten) zuzugreifen, aber nicht auf andere.

Wie kann ich also bestimmten Benutzern/Benutzergruppen auf bestimmte Ansichten zugreifen? Vielen Dank!

War es hilfreich?

Lösung

Benutzer, die ein bestimmtes Modell nicht hinzufügen oder ändern können, können es im Administrator nicht sehen.

Wenn wir über Ihre benutzerdefinierten erstellten Ansichten sprechen, können Sie etwas erstellen, das einen Benutzer auf eine Erlaubnis überprüft und einen 404 zurückgibt, wenn er diese Berechtigung nicht hat. Berechtigungen sind mit Modellen verknüpft und einer Gruppe kann verschiedene Berechtigungen zugewiesen werden.

Sie können einem Modell wie diesem eine Erlaubnis hinzufügen:

# myproject/myapp/models.py

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

Anschließend können Sie einen überprüfen, wenn ein Benutzer eine solche Berechtigung hat:

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

Mithilfe von Berechtigungen können Sie sie einfach von Benutzern und Gruppen hinzufügen oder entfernen, indem Sie einfach die Administratorschnittstelle verwenden.

Andere Tipps

Sie müssen das manuell verwalten, aber es ist ziemlich einfach. Vermutlich gibt es ein Attribut, das bestimmt, ob eine Gruppe die Erlaubnis hat, eine Ansicht zu sehen oder nicht permission_required Dekorateur, wenn es sich um eine einfache Frage handelt, ob der Benutzer eine bestimmte Berechtigung hat oder user_passes_test Wenn es etwas komplizierter ist:

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

vorausgesetzt, dass is_allowed_to_see_view_myview ist eine Art Methode im Benutzerobjekt.

Das Authentifizierungsdokention sind ziemlich umfassend.

Für klassenbasierte Ansichten können Sie erben UserPassesTestMixin Klasse in die Ansicht unterrichten und definieren 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')

Sich ansehen Diese Dokumente Weitere Informationen dazu verwenden:

Das Berechtigungssystem ist modellzentriert und geht davon aus, dass die Berechtigungen an Modelle gebunden sind. Ich denke, die folgenden 2 Alternativen sind die besten Optionen:

A. Wenn Ihre Ansichten mit einem bestimmten Modell zusammenhängen, verwenden Sie benutzerdefinierte Berechtigungen für dieses Modell, wie Marcus Whybrow vorgeschlagen hat.

B. [nicht getestet, möglicherweise nicht funktioniert] Unterklassen User und definieren Sie dort Ihre eigenen Berechtigungen. Sie benötigen kein echtes Modell, sondern nur Wrapper für die benutzerdefinierte Erlaubnis Ihrer App:

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

Vergiss nicht zu rennen syncdb So fügen Sie der Datenbank benutzerdefinierte Berechtigungen hinzu.

Wenn Sie Django 1.9+ verwenden, sollten Sie in der Lage sein, verwenden zu können PermissionRequiredMixin: https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.mixins.permissionRequiredmixin

Zum Beispiel:

from django.contrib.auth.mixins import PermissionRequiredMixin

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

Dies ist im Grunde ein Sonderfall von UserPassesTestMixin, speziell entwickelt, um zu testen, ob der Benutzer über die angegebene Berechtigung verfügt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top