Django - autorizzazioni utente a determinati punti di vista?
-
15-10-2019 - |
Domanda
Da admin vedo che è possibile allocare le autorizzazioni a un utente o un gruppo di utenti a:. Consentire aggiungere, modificare o cancellazione dei dati da un modello
Questo è grande, ma ho anche bisogno di consentire a un utente o un gruppo di utenti per l'accesso o meno un gruppo di punti di vista. Ho certo tipo di servizi sul mio sito web in modo che voglio per consentire ad alcuni utenti di accedere a determinati servizi (pagine / Vista), ma non gli altri.
Così come posso permettere ad alcuni utenti / gruppi di utenti l'accesso ad alcuni punti di vista? Grazie!
Soluzione
Gli utenti che non possono aggiungere o modificare ecc un certo modello, non sarà in grado di vederlo in Admin.
Se stiamo parlando di vostri punti di vista personalizzati creati allora si potrebbe creare qualcosa che assegni un utente per un permesso e restituisce un 404 se non hanno che il permesso. I permessi sono legati a modelli e un gruppo possono essere assegnati vari permessi.
È possibile aggiungere un permesso per un modello come questo:
# myproject/myapp/models.py
class MyModel(models.Model):
class Meta:
permissions = (
('permission_code', 'Friendly permission description'),
)
Quindi è possibile controllare un se un utente ha il permesso in questo modo:
@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
# ...
Utilizzando i permessi si può quindi facilmente aggiungere o rimuoverli da parte degli utenti e dei gruppi semplicemente utilizzando l'interfaccia di amministrazione.
Altri suggerimenti
È necessario gestire tale manualmente, ma è abbastanza facile. Presumibilmente c'è un attributo che determina se un gruppo ha il permesso di vedere una vista: poi basta decorare questo punto di vista sia con il decoratore permission_required
, se si tratta di una semplice questione di sapere se l'utente ha una particolare autorizzazione, o user_passes_test
se è un po ' più complicato:
@user_passes_test(lambda u: u.is_allowed_to_see_view_myview())
def myview(request):
...etc...
supponendo che is_allowed_to_see_view_myview
è una sorta di metodo sull'oggetto utente.
Il docs autenticazione sono abbastanza completo.
Per le viste base di classe è possibile ereditare classe UserPassesTestMixin
nella vista e definire 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')
Date un'occhiata al questa documentazione per maggiori dettagli su come utilizzare questo:
Systema permesso è il modello-centrico e si presuppone che le autorizzazioni sono legati a modelli. Credo che dopo 2 alternative sono migliori opzioni:
A. Se le vostre opinioni sono legati a qualche modello specifico, le autorizzazioni di utilizzo personalizzate su che modello come Marcus Whybrow suggerito.
B. [Non testato, potrebbe non funzionare] Subclasss User
e definire i propri permessi di lì. Non è necessario il modello attuale, è solo wrapper per l'autorizzazione doganale del vostro app:
from django.contrib.auth.models import User
class MyUser(User):
class Meta:
permissions = (('can_visit_$viewset1', 'Can visit $view_set_1'))
Non dimenticare di eseguire syncdb
per aggiungere autorizzazioni personalizzate a base di dati.
Se si utilizza Django 1.9+, si dovrebbe essere in grado di utilizzare PermissionRequiredMixin
: https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.mixins.PermissionRequiredMixin
Ad esempio:
from django.contrib.auth.mixins import PermissionRequiredMixin
class MainView(PermissionRequiredMixin, View):
permission_required = 'my_services.foo_bar'
...
Questo è fondamentalmente un caso speciale di UserPassesTestMixin
, progettato specificamente per verificare se l'utente ha il permesso indicata.