Pregunta

Estoy tratando de combinar Google App Engine con RPX Ahora autenticación de usuario y una por usuario patrón de acceso limitada.

El patrón de acceso limitante por usuario se basa en User.get_current_user global de GAE (), como tan:

from google.appengine.api import users

class CurrentUserProperty(db.UserProperty):
  def checkCurrentUser(self, value):
    if value != users.get_current_user():
      raise db.BadValueError(
          'Property %s must be the current user' % self.name)
    return value

  def __init__(self, verbose_name=None, name=None):
    super(CurrentUserProperty, self).__init__(
        verbose_name, name, required=True, 
        validator=self.checkCurrentUser)

Sin embargo, con GAE Utilities sesiones almacenamiento de identificador de usuario de RPX, no hay usuario mundial .

La solución más obvia para mí es crear una variable global de usuarios (de alguna manera localizada a la solicitud actual / hilo) en el middleware. Sin embargo, yo no haría esto a menos que yo estaba seguro de que no había condiciones de carrera.

¿Hay alguna manera de obtener la identidad del usuario actual (como se almacena en la variable de solicitud de sesión) al CurrentUserProperty cuando se construye CurrentUserProperty?

Gracias por la lectura.

Editar

Lectura de Google GAE / appengine / herramientas / dev_appserver.py: 578 que hace un:

579 env['USER_ID'] = user_id

y Google / appengine / api / users.py: 92ff que lee:

92  if _user_id is None and 'USER_ID' in os.environ:
93     _user_id = os.environ['USER_ID']

parece sugerir que se puede establecer con seguridad el medio ambiente en una única solicitud de Google App Engine (pero puedo estar equivocado!).

Es de suponer, entonces, puedo establecer una variable de entorno en el middleware. Huele a problemas, así que me gustaría saber si alguien más tiene (de manera similar) abordó este.

¿Fue útil?

Solución

casos de App Engine (y de hecho, CGI en general) se garantiza que sea, por lo que establecer una variable de entorno por la petición de un solo subproceso es de hecho seguro - de hecho, toda la información acerca de la petición actual se pasa a través del entorno actual ! Sólo asegúrese de que la variable de entorno _un_set si el usuario no está conectado, por lo que no se puede tener una solicitud no autenticado obtener la autenticación de la solicitud anterior para golpear la misma instancia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top