2013-02-14 19 views
5

C'è un'ultima cosa su cui sono un po 'confuso con e questo è il diverso tra le classi di autorizzazione e le classi di autenticazione.Differenza di Rango di Django tra le classi di autorizzazione e le classi di autenticazione

questo è il mio settings.py

REST_FRAMEWORK = { 
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAdminUser', 


), 
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication', 
    'rest_framework.authentication.SessionAuthentication', 
), 
'PAGINATE_BY': 10 

}

e, a mio avviso ho il seguente ...

class ProfileList(generics.ListCreateAPIView): 
    """ 
    API endpoint that represents a list of users. 
    """ 
    permission_classes = (permissions.IsAdminUser,) 
    model = Profile 
    serializer_class = ProfileSerializer 

    def pre_save(self, obj): 
     obj.owner = self.request.user 

Quello che ho pensato che sarebbe successo con sopra è che solo gli utenti admin hanno avuto accesso all'API navigabile mentre ancora un utente con un token valido potrebbe g e la richiesta di json. Tuttavia, questo non è il caso solo è IsAuthenticated sembra dare loro l'accesso ma = questo e consente ancora ai miei utenti di accedere alla versione online dopo il login.

Voglio tutti i miei utenti con un token valido per ottenere l'accesso, ma solo gli utenti amministratori hanno il permesso di visualizzare la versione dell'API online con le sessioni, è possibile?

risposta

6

voglio tutti i miei utenti con un gettone valido per ottenere l'accesso, ma solo gli utenti di amministratore per avere il permesso di visualizzare la versione online delle API con le sessioni, è possibile?

La prima cosa che vale la pena notare è che l'API navigabile non concederà agli utenti più permessi di quanti ne avrebbero se si eseguisse il rendering su JSON. È solo una vista molto più bella sugli endpoint dell'API. Personalmente, in genere, vorrei esporre l'API navigabile agli sviluppatori finali in quanto facilita lo sviluppo rispetto all'API.

Se davvero si vuole nasconderlo da tutti tranne utenti admin qui ci sono due approcci si poteva prendere:

  1. l'override del metodo get_renderers() sulla vista. (Brevemente documentato here) È possibile controllare self.request.user.is_staff e includere solo il renderer API Browseable se si tratta di un utente amministratore.

  2. Sottoclasse il renderer API navigabile e sovrascrittura .render(). (Ad esempio, vedi here) Puoi ottenere la richiesta in arrivo usando renderer_context['request'] e semplicemente renderizzare su JSON standard se non è un utente amministratore.

1

penso che funziona come descritto in the docs:

Se alcun controllo del permesso non un'eccezione exceptions.PermissionDenied sarà sollevata, e il corpo principale della vista non verrà eseguito.

Se si imposta IsAdminUser, l'utente deve essere un amministratore. Altrimenti non avrà il permesso, anche se sono fornite tutte le cose richieste in DEFAULT_AUTHENTICATION_CLASSES.

Problemi correlati