2009-09-30 8 views
0

Google App Engine을 RPX Now 사용자 인증과 per-user limited access 패턴으로 결합하려고합니다. RPX의 사용자 ID를 저장 GAE Utilities' 세션이 그러나Django 미들웨어에서 "글로벌 사전 요청 변수"설정

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) 

, 전역 사용자 없다 :

사용자 별 접근 제한 패턴(), 마치 너무 GAE의 글로벌 User.get_current_user에 의존한다.

가장 확실한 해결책은 미들웨어에서 일부 글로벌 사용자 변수 (현재 요청/스레드로 현지화되어 있음)를 만드는 것입니다. 그러나 경쟁 조건이 없다고 확신하지 못한다면 나는 이것을하지 않을 것입니다.

CurrentUserProperty가 생성 될 때 현재 사용자의 ID (요청 세션 변수에 저장 됨)를 CurrentUserProperty로 가져 오는 방법이 있습니까?

읽어 주셔서 감사합니다.

편집 :

579 env['USER_ID'] = user_id 

및 구글 /에서 appengine/API/users.py : 읽고 92ff

읽기 GAE의 구글 /에서 appengine/도구/dev_appserver.py 다음을 수행 578 :

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

하나의 Google App Engine 요청에서 환경을 안전하게 설정할 수 있다고 제안하는 것 같습니다.하지만 잘못된 것일 수 있습니다.

아마도 미들웨어에 환경 변수를 설정할 수 있습니다. 그것은 문제의 냄새가 나고, 다른 누군가가 (비슷하게) 이것을 처리했는지 알고 싶습니다.

답변

2

App Engine 인스턴스 (실제로는 일반적으로 CGI)는 단일 스레드로 보장되므로 요청 당 환경 변수를 설정하는 것은 실제로 안전합니다. 현재 요청에 대한 모든 정보는 현재 요청을 통해 전달됩니다 환경! 사용자가 로그인하지 않았다면 환경 변수가 _un_set되어 있는지 확인하십시오. 그러면 인증되지 않은 요청을 할 수 없으므로 동일한 인스턴스에 대한 이전 요청의 인증을 얻지 못합니다.

+3

WSGI 응용 프로그램은 일반적으로 단일 스레드로 보장되지 않습니다. App Engine에서 WSGI의 경우 일 수 있지만 다른 곳에서는 그렇지 않을 수 있습니다. WSGI 환경에는 'wsgi.multithread'라는 플래그가 있습니다. 이것은 심지어 존재하는 것은 스레드를 사용하는 동시 요청을 처리하는 프로세스 컨텍스트 내에서 작동 할 수 있다는 힌트입니다. 따라서 os.environ에서 프로세스 레벨 환경 변수를 설정하는 것은 위험하고 이식성이 없습니다. –

+0

GAE 요청이 단일 스레드 (또는 적어도 내가 읽은 방법)로 보장된다는 Nick Johnson의 진술에 기반하여 GAE는 사용자 신원을 유지하기 위해 환경을 사용하고 GAE에 대한 경험은 있지만 Graham Dumpleton의 예약에 유의해야합니다 이것이 휴대용 솔루션이 아니라는 것이 내 질문에 대한 대답입니다. –

+0

내 실수 - WSGI는 실제로 다중 스레드 될 수 있습니다. 나는 그것을 반영하기 위해 나의 대답을 업데이트했다. –

관련 문제