que tienden a utilizar mi propio usuario y la sesión de manangement
Para mis manejadores web voy a adjuntar un decorador llamado session
y uno llamado authorize
. El decorador session
adjuntará una sesión a cada solicitud, y el decorador authorize
se asegurará de que el usuario esté autorizado.
(Una palabra de advertencia, el decorador autorizar es específico de cómo desarrollo mis aplicaciones, el nombre de usuario es el primer parámetro en la mayoría de las solicitudes).
Así, por ejemplo, un controlador de banda puede verse como:
class UserProfile(webapp.RequestHandler):
@session
@authorize
def get(self, user):
# Do some funky stuff
# The session is attached to the self object.
someObjectAttachedToSession = self.SessionObj.SomeStuff
self.response.out.write("hello %s" % user)
En el código anterior, el decorador session
atribuye algunas cosas que necesito sesión basado en las galletas que están presentes en la solicitud. El encabezado authorize
se asegurará de que el usuario solo pueda acceder a la página si la sesión es la correcta.
El código decoradores son a continuación:
import functools
from model import Session
import logging
def authorize(redirectTo = "/"):
def factory(method):
'Ensures that when an auth cookie is presented to the request that is is valid'
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
#Get the session parameters
auth_id = self.request.cookies.get('auth_id', '')
session_id = self.request.cookies.get('session_id', '')
#Check the db for the session
session = Session.GetSession(session_id, auth_id)
if session is None:
self.redirect(redirectTo)
return
else:
if session.settings is None:
self.redirect(redirectTo)
return
username = session.settings.key().name()
if len(args) > 0:
if username != args[0]:
# The user is allowed to view this page.
self.redirect(redirectTo)
return
result = method(self, *args, **kwargs)
return result
return wrapper
return factory
def session(method):
'Ensures that the sessions object (if it exists) is attached to the request.'
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
#Get the session parameters
auth_id = self.request.cookies.get('auth_id', '')
session_id = self.request.cookies.get('session_id', '')
#Check the db for the session
session = Session.GetSession(session_id, auth_id)
if session is None:
session = Session()
session.session_id = Session.MakeId()
session.auth_token = Session.MakeId()
session.put()
# Attach the session to the method
self.SessionObj = session
#Call the handler.
result = method(self, *args, **kwargs)
self.response.headers.add_header('Set-Cookie', 'auth_id=%s; path=/; HttpOnly' % str(session.auth_token))
self.response.headers.add_header('Set-Cookie', 'session_id=%s; path=/; HttpOnly' % str(session.session_id))
return result
return wrapper
def redirect(method, redirect = "/user/"):
'When a known user is logged in redirect them to their home page'
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
try:
if self.SessionObj is not None:
if self.SessionObj.settings is not None:
# Check that the session is correct
username = self.SessionObj.settings.key().name()
self.redirect(redirect + username)
return
except:
pass
return method(self, *args, **kwargs)
return wrapper
Aunque he utilizado Django-en-App Engine, no estaría a favor de ignorar appengines incorporadas auth sobre Django. ¿Alguna razón por la que lo haces? (Sí, uso Django fuera de appengine también) – ironfroggy
La autenticación incorporada de GAE solo admite cuentas de Google y, en particular, no admite el "registro de usuarios", que la pregunta requiere específicamente (es por eso que ni siquiera me molesté en sugerir OpenID esta vez. Las últimas veces que lo hice, los consultadores lo vieron como un ataque al deseo de lidiar con su propio registro de usuario. –
Los usuarios pueden registrarse contra la aplicación específicamente la primera vez que inician sesión con sus credenciales de Google (u OpenID). –