Pergunta

Eu estou tentando combinar o Google App Engine com autenticação RPX Agora usuário e uma acesso por usuário limitado padrão.

O padrão de acesso de limitação por usuário depende User.get_current_user global da GAE (), como-assim:

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)

No entanto, com GAE Utilities' sessões armazenar identificador do usuário do RPX, não há nenhuma mundial Usuário .

A solução mais óbvia para mim é criar alguma variável usuário global (de alguma forma localizada no atual solicitação / thread) no middleware. No entanto, eu não faria isso a menos que eu estava confiante de que não havia condições de corrida.

Existe alguma maneira de obter a identidade do usuário atual (como armazenado na variável solicitação de sessão) para o CurrentUserProperty quando CurrentUserProperty é construída?

Obrigado pela leitura.

Editar :

google do Reading GAE / appengine / ferramentas / dev_appserver.py: 578, que faz a:

579 env['USER_ID'] = user_id

e google / appengine / api / users.py: 92ff onde se lê:

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

parece sugerir que é possível definir com segurança o ambiente em uma única solicitação do Google App Engine (mas posso estar errado!).

Presumivelmente, então, eu posso definir uma variável de ambiente em middleware. Tem cheiro de problemas, então eu gostaria de saber se alguém tem (semelhante) abordou esta.

Foi útil?

Solução

instâncias do Google App Engine (e de fato, CGI em geral) são garantidos para ser single-threaded, assim, definir uma variável de ambiente por solicitação é realmente seguro - na verdade, todas as informações sobre a solicitação atual é passado através do ambiente atual ! Apenas certifique-se que você _un_set a variável de ambiente, se o usuário não está logado, para que você não pode ter um pedido não autenticado obter a autenticação do pedido anterior para acertar a mesma instância.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top