Jak używać grup i uprawnień Django?

Odpowiedzi:

121

Przypuszczam, że pierwszym pytaniem, które musisz zadać, jest to, jakie uprawnienia potrzebujesz i jakiego rodzaju. Jakiego rodzaju, mam na myśli, czy chcesz na poziomie modelu czy obiektu. Aby wyjaśnić różnicę, powiedz, że masz model samochodu. Jeśli chcesz nadać uprawnienia do wszystkich samochodów, wybierz poziom modelu, ale jeśli chcesz nadać uprawnienia na podstawie samochodu, wybierz opcję Poziom obiektu. Możesz potrzebować obu, a to nie jest problem, jak zobaczymy.

Jeśli chodzi o uprawnienia modelu, Django obsługuje je za Ciebie ... głównie. Dla każdego modelu Django utworzy uprawnienia w postaci „nazwa aplikacji.permissionname_modelname”. Jeśli masz aplikację o nazwie „drivers” z modelem samochodu, jednym uprawnieniem będzie „drivers.delete_car”. Uprawnienia, które Django automatycznie utworzy, zostaną utworzone, zmienione i usunięte. Z jakiegoś dziwnego powodu zdecydowali się nie włączać uprawnień do odczytu z CRUD, będziesz musiał to zrobić sam. Zwróć uwagę, że Django zdecydował się z jakiegoś powodu zmienić „update” CRUD na „zmienić”. Aby dodać więcej uprawnień do modelu, powiedzmy uprawnienia do odczytu, użyj klasy Meta:

class Car( models.Model ):
    # model stuff here
    class Meta:
        permissions = ( 
            ( "read_car", "Can read Car" ),
        )

Zwróć uwagę, że uprawnienia to zestaw krotek, gdzie elementy krotki to uprawnienia opisane powyżej i opis tego uprawnienia. Nie musisz przestrzegać konwencji permname_modelname, ale zwykle się jej trzymam.

Wreszcie, aby sprawdzić uprawnienia, możesz użyć has_perm:

obj.has_perm( 'drivers.read_car' )

Gdzie obj jest instancją użytkownika lub grupy. Myślę, że prostsze jest napisanie funkcji do tego:

def has_model_permissions( entity, model, perms, app ):
    for p in perms:
        if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
            return False
    return True

Gdzie obiekt jest obiektem do sprawdzenia uprawnień (Grupa lub Użytkownik), model jest instancją modelu, uprawnienia to lista uprawnień w postaci ciągów do sprawdzenia (np. [„Odczyt”, „zmiana”]), a aplikacja jest nazwa aplikacji jako ciąg. Aby wykonać to samo sprawdzenie co has_perm powyżej, wywołałbyś coś takiego:

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

Jeśli potrzebujesz uprawnień do obiektów lub wierszy (mają one na myśli to samo), to Django samo z siebie nie może ci pomóc. Fajną rzeczą jest to, że możesz używać jednocześnie uprawnień do modelu i do obiektów. Jeśli chcesz mieć uprawnienia do obiektów, musisz albo napisać własne (jeśli używasz 1.2+), albo znaleźć projekt napisany przez kogoś innego, jedno, które lubię, to django-objectpermissions from washingtontimes.

Alex Kuhl
źródło
27
To świetna odpowiedź na uprawnienia, ale ledwo dotyka grup i jak działają w Django?
NotSimon
4
Grupy nie mają wiele, służą głównie do łączenia użytkowników w celu nadawania uprawnień, podobnie jak grupy użytkowników Linuksa. Dajesz pozwolenie grupie i obejmuje ono wszystkich członków tej grupy. Dokumentacja mówi wszystko naprawdę: docs.djangoproject.com/en/dev/topics/auth/default/#groups .
Alex Kuhl
1
Czuję się zmuszony wskazać tutaj, że chcesz rozważyć użycie do tego strażnika django . Zobacz zestawienie pakietów autoryzacyjnych tutaj. Również ten link SOF zapewnia dobre porównanie.
Jeff Sheffield
1
Kiedy natknąłem się na to i potrzebowałem pozwolenia na obiekt, znalazłem django-guardian: django-guardian.readthedocs.org/en/v1.2
dArignac
1
Opcja „napisz własne” nie działa. Lub coś. Teraz jest po chińsku.
William Karlsson