2008-09-19 9 views
11

Estoy a punto de poner una versión beta del sitio en el que estoy trabajando en la web. Necesita tener un código beta para restringir el acceso. El sitio está escrito en django.Haciendo un código beta para un sitio público de django

No quiero cambiar el sistema Auth básico para dar cabida a un código beta, y no me importa en particular que la seguridad del código beta esté revestida de hierro, solo que es un obstáculo significativo.

¿Cómo debo hacer esto? Es un proyecto bastante grande, por lo que agregar código a cada vista dista mucho de ser ideal.


Esa solución funciona bien. La clase middleware que terminó con esta esto:

from django.http import HttpResponseRedirect 

class BetaMiddleware(object): 
    """ 
    Require beta code session key in order to view any page. 
    """ 
    def process_request(self, request): 
     if request.path != '/beta/' and not request.session.get('in_beta'): 
      return HttpResponseRedirect('%s?next=%s' % ('/beta/', request.path)) 

Respuesta

19

Comience con this Django snippet, pero modifíquelo para marcar request.session['has_beta_access']. Si no lo tienen, haga que devuelva un redireccionamiento a una página "ingresar código beta" que, cuando se publica con el código correcto, establece esa variable de sesión en True.

Convertirlo en una versión beta pública simplemente consiste en eliminar ese middleware de su configuración MIDDLEWARE_CLASSES.

0

usted debería ser capaz de añadir @login_required decoradores a través del tablero y hacerse con él. A menos que tenga una carga de funciones de vista, no debería ser demasiado horrible.

+0

El problema con esto es que luego quien está tratando de obtener acceso se lleva a la página de inicio de sesión, en lugar de a una página para ingresar un código beta. La página de inicio de sesión tiene todos los menús y ui a su alrededor. Me gustaría mantener esas cosas en privado por ahora. – defrex

+0

@defrex, haga su propio decorador de login_required que envuelve la versión incorporada de Django. Cuando salga a la luz, simplemente reemplácelo por Django por completo. –

4

Probablemente pueda restringir el acceso a todo el sitio a través de apache con htaccess, eliminando por completo el problema del espacio del proyecto django.

2

Haga lo que hizo StackOverflow.

Tenían un formulario simple de correo electrónico/contraseña. Tenía una sola contraseña codificada (falkensmaze). Cuando el usuario obtiene la contraseña correcta, configure una cookie. p.ej. auth = 1

No se preocupe, no es seguro. ¿A quién le importa si alguien piratea la versión beta?

Apache/htaccess es también una solución agradable y simple.

+0

Esto implica que tengo que verificar la existencia de una cookie en cada vista.Prefiero evitar agregar código a cada vista. ¿Hay alguna forma de verificar una cookie globalmente en django? – defrex

+0

@defrex sí con un middleware. Ver la respuesta de AdamKG. – imns

0

No estoy seguro de la versión del código Pinax que está utilizando, pero han creado la capacidad de cerrar el sitio para una versión beta privada, por lo que no necesita hacer mucho trabajo.

El enlace a la plantilla de proyecto específico para un sitio beta privado está aquí: http://github.com/pinax/pinax/tree/3ad73d1ba44f37365333bae17b507668b0eb7e16/pinax/projects/private_beta_project aunque creo que desde entonces pueden haber agregado esa funcionalidad a todas las plantillas de proyecto.

+0

Una versión muy antigua de pinax. La pregunta se hizo en septiembre de 2008. Sin embargo, es un buen punto, así que eliminé la referencia a pinax para que la gente no se deje engañar. – defrex

0

Fragmento excelente pero resultó en muchos problemas para mí relacionados con las sesiones de OpenId. Así que me acaban de confiar en las galletas en lugar de la Sesión:

class BetaMiddleware(object): 
    """ 
    Require beta code cookie key in order to view any page. 
    """ 
    set_beta = False 
    def process_request(self, request): 
     referer = request.META.get('HTTP_REFERER', '') 

     if request.method == 'GET' and not 'is_in_beta' in request.COOKIES: 
      return HttpResponseRedirect('%s?next=%s' % ('/beta/', request.path)) 

     if request.method == 'POST' and 'pass' in request.POST: 
      code = request.POST['pass'] 

      if code=='beta': 
       self.set_beta = True 
       return HttpResponseRedirect('%s' % '/') 

    def process_response(self, request, response):   

     if self.set_beta is True: 
      response.set_cookie('is_in_beta', '1') 
     return response 

No es seguro, pero eso es suficiente para mí. Esto también funciona con solo una página beta html.

Cuestiones relacionadas