2012-09-03 32 views
6

Estoy usando Tastypie 0.9.11 y quiero que los usuarios no autentificados tengan permisos de solo lectura para la API mientras que, al mismo tiempo, si es un usuario se autentica con una autenticación de clave API, ese usuario puede realizar operaciones de agregar/cambiar/eliminar en esos mismos modelos.Tastypie - Permitir permisos de solo lectura para usuarios no autenticados al permitir permisos de escritura autorizados

Uso de Autenticación de clave API + Autorización de Django no cumple el requisito 1 (los usuarios no autenticados no pueden acceder a la API en absoluto). El uso de Sin autenticación no permite a los usuarios autenticarse con una clave API (que no cumple el requisito 2).

Apuesto a que hay una manera simple de lograr este comportamiento, por favor ayuda.

Muchas gracias, Yuval Cohen

Respuesta

8

Hay dos cosas que usted necesita considerar. Autenticacion y autorizacion.

Primero necesita autenticar a todos los usuarios sin importar la clave de la API si el método de solicitud es GET, para todos los demás métodos, utilice ApiKeyAuthentication.

Ahora, todos los usuarios autenticados están sujetos a autorización. Aquí también debe asegurarse de que las solicitudes GET siempre estén permitidas. Algo como esto debería empezar:

from tastypie.resources import ModelResource 
from tastypie.authentication import ApiKeyAuthentication 
from tastypie.authorization import DjangoAuthorization 

class MyAuthentication(ApiKeyAuthentication): 
    """ 
    Authenticates everyone if the request is GET otherwise performs 
    ApiKeyAuthentication. 
    """ 

    def is_authenticated(self, request, **kwargs): 
     if request.method == 'GET': 
      return True 
     return super(MyAuthentication, self).is_authenticated(request, **kwargs) 

class MyAuthorization(DjangoAuthorization) 
    """ 
    Authorizes every authenticated user to perform GET, for all others 
    performs DjangoAuthorization. 
    """ 

    def is_authorized(self, request, object=None): 
     if request.method == 'GET': 
      return True 
     else: 
      return super(MyAuthorization, self).is_authorized(request, object) 

class MyResource(ModelResource): 

    class Meta: 
     authentication = MyAuthentication() 
     authorization = MyAuthorization() 

Así que, básicamente, su enfoque para el uso de ApiKeyAuthentication y DjangoAuthorization solamente carecían de un tratamiento especial para las solicitudes GET.

+0

Gracias por la solución detallada. Funciona bien. Me salté la Autorización_Mi ya que la Autorización Django ya permite solicitudes GET todo el tiempo. –

+0

De nada :) Me alegra que haya funcionado. – kgr

Cuestiones relacionadas