2009-08-13 17 views
6

Nie mogę zrozumieć, dlaczego pozwolenie wymagane dekorator nie działa. Chciałbym umożliwić dostęp do widoku tylko członkom personelu. PróbowałemPozwolenie_required decorator nie działa dla mnie

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

a także

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

jako administrator, mogę przejść do widoku, ale każdy użytkownik tworzę jako personel nie może uzyskać do niego dostęp i zostaje przekierowany do strony logowania url. Przetestowałem dekorator login_required i to działa dobrze.

Odpowiedz

22

permission_required() należy przekazać nazwę uprawnienia, a nie wyrażenie w języku Python w ciągu znaków. Spróbuj to zamiast:

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) 
... 

Dzięki. To działa. Czy masz przykład, jak używać permission_required? Od dokumentacja docs.djangoproject.com/en/1.0/... and djangobook.com/en/2.0/chapter14 I myślałem, że powinienem pracować.

Ponownie przeczytaj opublikowane linki; permission_required() sprawdzi, czy użytkownik otrzymał konkretne pozwolenie. Nie testuje atrybutów obiektu użytkownika.

Od 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

Dzięki. To działa. Czy masz przykład jak używać permission_required? Z dokumentacji http://docs.djangoproject.com/en/1.0/topics/auth/#the-permission-required-decorator i http://www.djangobook.com/en/2.0/chapter14/ Myślałem, co ja powinien zadziałać. – Mitch

+0

Ah. Widzę. Dzięki za wytrwałość. – Mitch

+2

Czy możesz wyjaśnić, co się dzieje z ** "polls.can_vote" ** parametrem na końcu? Jaki jest jego cel i gdzie się on odnosi? Czy to może nazwa grupy, której musi być członkiem? –

1

Oto przykład z zachowania nie rozumiem. Tworzę użytkownika, żądam i udekoruję funkcję testową za pomocą permission_required sprawdzając "is_staff". Jeśli użytkownik jest superużytkownikiem, to dostęp do funkcji testowej zostaje przyznany. Jeśli użytkownik ma tylko wartość is_staff = True, dostęp nie zostanie przyznany.

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 jest atrybutem obiektu użytkownika, a nie uprawnieniem. –

3

To w jaki sposób to zrobić:

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

@staff_member_required 
def series_info(request): 
    ... 

Dokumentacja mówi o staff_member_required:

Dekorator do poglądów, które sprawdza, czy użytkownik jest zalogowany i jest członkiem personelu , wyświetlając stronę logowania, jeśli to konieczne.

0

Nawiasem mówiąc, jeśli używasz poglądy oparte klasy, należy owinąć w method_decorator dekorator dekorator (przejdź rysunek):

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

dla 'Django> = 1.9' można użyć [PermissionRequiredMixin] (https://docs.djangoproject.com/en/dev/topics/auth/default/#the-permissionrequiredmixin-mixin) z' Widokami opartymi na klasach' –

0

Działa to dla mnie na moim „przedsięwzięcie” tabela/model:

@permission_required('myApp.add_project') 
def create(request): 
    # python code etc... 

Oczywiście zmień parametr add_project na add_ [bez względu na model/tabelę]. Aby dokonać edycji, należy:

@permission_required ('myApp.edit_project ')

i usunąć:

@permission_required (' myApp.delete_project ')

Ale okazało się, że kluczową sprawą jest, aby upewnić się, że tabele auth są ustawione prawidłowo. To właśnie spowodowało mi problemy. Oto zapytanie SQL MySQL, które napisałem, aby sprawdzić uprawnienia, jeśli korzystasz z grup. To powinno działać w większości dB:

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; 

odkryłem, że moje uprawnienia nie zostały ustawione poprawnie, a także uważaj na stole django_content_type który musi mieć wierszy dla każdej aplikacji i stołem dla każdego dodawać, edytować, usuwać . Więc jeśli masz tabelę projekt powinien to zobaczyć w django_content_type:

id   [generated by dB] 
app_label myApp 
model  project 

Jeśli masz problemy z kolejnym dobrym pomysłem jest, aby włączyć i korzystać z aplikacji Django administratora. Dzięki temu dowiesz się, gdzie znajdują się twoje problemy, a konfigurując niektóre uprawnienia testowe, użytkownicy i grupy, możesz przeanalizować tabele omówione powyżej, aby zobaczyć, co jest wstawiane gdzie. To da ci pojęcie, jak działają uprawnienia auth.

Piszę to, aby uratować kogoś przed spędzeniem kilku godzin, zastanawiając się, co zrobiłem!

Powiązane problemy