16

Od administratora widzę, że możesz przydzielić uprawnienia użytkownikowi lub grupie użytkowników, aby: zezwolić na dodawanie, zmienianie lub usuwanie danych z modelu.Django - uprawnienia użytkownika do niektórych widoków?

To świetnie, ale muszę również zezwolić użytkownikowi lub grupie użytkowników na dostęp do grupy widoków. Mam pewne rodzaje usług na mojej stronie, więc chcę umożliwić niektórym użytkownikom dostęp do niektórych usług (stron/widoków), ale nie do innych.

Jak mogę zezwolić określonym użytkownikom/grupom użytkowników na dostęp do określonych widoków? Dziękuję Ci!

Odpowiedz

22

Użytkownicy, którzy nie mogą dodawać ani zmieniać itp. Danego modelu, nie zobaczą go w administratorze.

Jeśli mówimy o twoich niestandardowych widokach, możesz stworzyć coś, co sprawdzi uprawnienia użytkownika i zwróci 404, jeśli nie ma tego pozwolenia. Uprawnienia są powiązane z modelami, a grupie można przypisać różne uprawnienia.

Możesz dodać uprawnienie do modelu jak ten:

# myproject/myapp/models.py 

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

Następnie Można sprawdzić, czy użytkownik ma uprawnienia takiego:

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

pomocą uprawnień można następnie łatwo dodać lub usuń je z użytkowników i grup za pomocą interfejsu administratora.

+0

Tak, mam na myśli niestandardowe widoki, które utworzyłem, a nie admin. – avatar

+0

Dziękuję. Dam temu szansę. Wygląda stosunkowo łatwo. – avatar

+0

@permission_required byłoby łatwiejsze i bardziej eleganckie tutaj – Manur

9

Musisz to zrobić ręcznie, ale to całkiem proste. Przypuszczalnie istnieje atrybut określający, czy dana grupa ma uprawnienia do wyświetlania widoku: po prostu dekorujesz ten widok za pomocą dekoratora permission_required, jeśli jest to proste pytanie, czy użytkownik ma określone uprawnienia, czy też user_passes_test, jeśli jest nieco bardziej skomplikowane:

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

zakładając, że is_allowed_to_see_view_myview jest jakaś metoda na obiekcie użytkownika.

The authentication docs są dość obszerne.

1

System uprawnień jest zorientowany na model i zakłada, że ​​uprawnienia są powiązane z modelami. Myślę, że następujące 2 alternatywy to najlepsze opcje:

A. Jeśli twoje poglądy są powiązane z konkretnym modelem, użyj niestandardowych uprawnień dla tego modelu, jak zasugerował Marcus Whybrow.

B. [Nie testowano, może nie działać] Podklasy User i określ tam swoje własne uprawnienia. Nie trzeba rzeczywistego modelu, to tylko nakładka na zamówienie zgody swojej aplikacji:

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

Nie zapomnij uruchomić syncdb dodać niestandardowe uprawnienia do bazy danych.

+0

Od Django 1.3 nie ma sposobu na podklasę użytkownika (oprócz używania AUTH_PROFILE_MODULE, ale to nie pomaga tutaj). – SystemParadox

1

Dla widoków klasy oparte można dziedziczyć UserPassesTestMixin klasę na widoku i zdefiniować 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') 

Spójrz na this docs wiecej informacji na temat korzystania z tego:

+0

Ważna informacja, jest to dość nowa funkcja Django (wersje 1.9+) – Drachenfels