2009-08-13 18 views
6

Ich kann nicht herausfinden, warum die Erlaubnis erforderlich Decorator funktioniert nicht. Ich möchte den Zugang zu einer Sicht nur für Mitarbeiter erlauben. Ich habe versucht,permission_required Decorator funktioniert nicht für mich

@permission_required('request.user.is_staff',login_url="../admin") 
def series_info(request): 
    ... 

und auch

@permission_required('user.is_staff',login_url="../admin") 
def series_info(request): 
    ... 

Als Super-User, ich die Ansicht zugreifen können, aber alle Benutzer ich als Mitarbeiter erstellen können nicht darauf zugreifen und sind auf die Login-URL-Seite umgeleitet. Ich habe den login_required Decorator getestet und das funktioniert gut.

Antwort

22

permission_required() muss ein Berechtigungsname und kein Python-Ausdruck in einer Zeichenfolge übergeben werden. Versuchen Sie stattdessen:

from contrib.auth.decorators import user_passes_test 
def staff_required(login_url=None): 
    return user_passes_test(lambda u: u.is_staff, login_url=login_url) 

@staff_required(login_url="../admin") 
def series_info(request) 
... 

Dank. Das funktioniert. Haben Sie ein Beispiel für die Verwendung von permission_required? Von der Dokumentation docs.djangoproject.com/en/1.0/... und djangobook.com/de/2.0/chapter14 Ich dachte was ich hätte arbeiten sollen.

Die von Ihnen geposteten Links erneut lesen; permission_required() testet, ob einem Benutzer eine bestimmte Berechtigung erteilt wurde. Es testet keine Attribute des Benutzerobjekts.

Von http://www.djangobook.com/en/2.0/chapter14/:

def vote(request): 
    if request.user.is_authenticated() and request.user.has_perm('polls.can_vote')): 
     # vote here 
    else: 
     return HttpResponse("You can't vote in this poll.") 

    # 
    # 
# # # 
    ### 
    # 

def user_can_vote(user): 
    return user.is_authenticated() and user.has_perm("polls.can_vote") 

@user_passes_test(user_can_vote, login_url="/login/") 
def vote(request): 
    # vote here 

    # 
    # 
# # # 
    ### 
    # 

from django.contrib.auth.decorators import permission_required 

@permission_required('polls.can_vote', login_url="/login/") 
def vote(request): 
    # vote here 
+0

Danke. Das funktioniert. Haben Sie ein Beispiel für die Verwendung von permission_required? Aus der Dokumentation http://docs.djangoproject.com/en/1.0/topics/auth/#the-permission-required-decorator und http://www.djangobook.com/en/2.0/chapter14/ dachte ich was ich hätte funktionieren sollen. – Mitch

+0

Ah. Aha. Danke für das Durchhalten. – Mitch

+2

Können Sie bitte erklären, was mit dem Parameter ** 'polls.can_vote' ** am Ende passiert? Was ist der Zweck und wo bezieht es sich? Ist es vielleicht der Name der Gruppe, der ein Mitglied angehören muss? –

1

Hier ist ein Beispiel für das Verhalten Ich verstehe nicht. Ich erstelle einen Benutzer, fordere und schmücke eine Testfunktion mit permission_required auf 'is_staff'. Wenn der Benutzer Superuser ist, wird der Zugriff auf die Testfunktion gewährt. Wenn der Benutzer nur is_staff = True hat, wird der Zugriff nicht gewährt.

from django.http import HttpRequest 
from django.contrib.auth.models import User 
from django.contrib.auth.decorators import permission_required 

@permission_required('is_staff') 
def test(dummy='dummy'): 
    print 'In test' 

mb_user = User.objects.create_user('mitch', '[email protected]', 'mbpassword') 
mb_user.is_staff = True 

req = HttpRequest() 
req.user = mb_user 

test(req) # access to test denied - redirected 

req.user.is_staff = False 

test(req) # same as when is_staff is True 

req.user.is_superuser = True 
test(req) # access to test allowed 
+1

is_staff ist ein Attribut des Benutzerobjekts, keine Berechtigung. –

3

Dies ist, wie ich es tun würde:

from django.contrib.admin.views.decorators import staff_member_required 

@staff_member_required 
def series_info(request): 
    ... 

Die Dokumentation sagt über staff_member_required:

Ausstatter für Ansichten, die, dass der Benutzer angemeldet ist überprüft und ist Mitarbeiter , Anzeige der Login-Seite bei Bedarf.

0

By the way, wenn Sie mit klassenbasierten Ansichten, sollten Sie Ihren Dekorateur in dem method_decorator Dekorateur wickeln (go figure):

class MyView(DetailView): 
    ... 
    @method_decorator(permission_required('polls.can_vote', login_url=reverse_lazy('my_login'))) 
    def dispatch(self, request, *args, **kwargs): 
     .... blah .... 

class MyModel(models.Model): 
    ... 
    def has_perm(self perm, obj=None): 
     if perm == 'polls.canvote': 
      return self.can_vote() 
+1

für 'Django> = 1.9' können Sie [PermissionRequiredMixin] (https://docs.djangoproject.com/en/dev/topics/auth/default/#the-permissionrequiredmixin-mixin) mit' Class Based Views' verwenden –

0

Dies funktioniert für mich auf meinem 'Projekt' table/model:

Offensichtlich ändern Sie das add_project zum add_ [was auch immer Ihr Modell/Tabelle ist]. Um es zu bearbeiten wäre:

@permission_required ('myApp.edit_project ')

und löschen:

@permission_required (' myApp.delete_project ')

Aber ich fand, dass der Schlüssel, was Ihre Auth-Tabellen korrekt eingerichtet sind, um sicherzustellen, ist. Das hat mir Probleme gemacht. Hier ist eine MySQL SQL-Abfrage, die ich geschrieben habe, um Berechtigungen zu prüfen, wenn Sie Gruppen verwenden. Dies sollte in den meisten dBs arbeiten:

select usr.id as 'user id',usr.username,grp.id as 'group id',grp.name as 'group name',grpu.id as 'auth_user_groups',grpp.id as 'auth_group_permissions',perm.name,perm.codename 
from auth_user usr 
left join auth_user_groups grpu on usr.id = grpu.user_id 
left join auth_group grp on grpu.group_id = grp.id 
left join auth_group_permissions grpp on grp.id = grpp.group_id 
left join auth_permission perm on grpp.permission_id = perm.id 
order by usr.id; 

Ich fand, dass meine Rechte wurden nicht richtig eingerichtet, und auch für die django_content_type Tabelle achten, welche Zeilen für jede App und Tabelle für jede Add haben müssen, bearbeiten, löschen . Wenn Sie also eine Projekttabelle haben, sollten Sie dies in django_content_type sehen:

id   [generated by dB] 
app_label myApp 
model  project 

Wenn Sie Probleme haben eine andere gute Idee, die django Admin-App zu aktivieren und zu verwenden ist. Dies wird Ihnen zeigen, wo Ihre Probleme liegen, und indem Sie einige Testberechtigungen, Benutzer und Gruppen einrichten, können Sie die oben besprochenen Tabellen untersuchen, um zu sehen, was wo eingefügt wird. Dadurch erhalten Sie eine gute Vorstellung davon, wie Autorisierungsberechtigungen funktionieren.

Ich schreibe das, um vielleicht jemanden zu retten, der ein paar Stunden damit verbringen muss herauszufinden, was ich getan habe!

Verwandte Themen