2014-05-19 3 views
0

웹 페이지를 호출하기 전에 관리자가 로그인했는지 확인하는 앱이 GAE에 있습니다. 나는 로그인 프로세스를 관리하는 다양한 방법을 시도했다.사용자 인증 모범 사례

l - 예제 2의 데코레이터에서 내가 뭘 잘못하고 있니?
질문 2 - 게시물 기능에 대해서도 일반적으로이 확인을 수행합니까?

전에 각 get 함수에서 if 문을 사용했습니다. 문제는 각 함수에서이 if 문을 반복해서 반복한다는 것입니다.

class IncomePage(webapp2.RequestHandler): 
    def get(self): 
    if users.is_current_user_admin(): 
     self.response.write('My Webpage') 
    else: 
     self.response.write('Please Login') 

그런 다음 데코레이터를 만들어 보았습니다. 작동하지 않아서 내가 뭘 잘못하고있는거야.

def check(func): 
    if users.is_current_user_admin(): 
    return func 
    else: 
    response.write('Please Login') ### Doesn't work 

class IncomePage(webapp2.RequestHandler): 
    @check 
    def get(self): 
     self.response.write('My Webpage') 

답변

5

장식품이 아닙니다. 데코레이터는 실제 함수 대신 호출되는 래퍼 함수를 ​​반환해야하며, 래퍼는 테스트를 수행 한 다음 원본을 호출해야합니다.

def check(func): 
    def wrapper(*args, **kwargs): 
    if users.is_current_user_admin(): 
     return func(*args, **kwargs) 
    else: 
     response.write('Please Login') 
    return wrapper 
+0

감사를 참조하십시오 무엇을 필요로 할 수있는 핸들러 장식을 가지고 있지만 Response.Write를 역시 작동하지 않습니다. –

+0

데코레이터의 해당 지점에서 응답에 액세스 할 수 없습니다. 'args'의 첫 번째 인수는'self'가 될 것이므로 여러분은 그것을 꺼내서 응답을 요청해야합니다. 아마 args [0] .response와 같이 보일 것이다.write()' –

+0

내 마지막 질문, 내 게시물 기능에 이것을 사용해야합니까? –

4

핸들러의 모든 사용자가 로그인이 admin 일해야하는 경우에, 당신은 애플리케이션 제목보다는 코드에 제한을 지정할 수 있습니다.

https://developers.google.com/appengine/docs/python/config/appconfig#Python_app_yaml_Requiring_login_or_administrator_status를 참조하십시오 그리고 완전하게 탈지하지 않는 문서를 읽어보십시오

- url: /admin/.* 
    script: somefile.application 
    login: admin 

처럼 보일 것입니다. . 당신이 몇 가지 추가 옵션

auth_fail_action 로그인이 존재하고 사용자가 로그인 하지 않을 때

가 취한 조치를 설명이 분명하다 두 가지 값이 있습니다

리디렉션 (기본값). 사용자는 Google 로그인 페이지로 리디렉션되거나 OpenID 인증이 사용되는 경우/_ah/login_required 페이지로 리디렉션됩니다. 사용자는 로그인 한 후 애플리케이션 URL로 리디렉션되거나 계정을 생성합니다. 무단으로. HTTP 상태 코드 401 및 오류 메시지와 함께 요청이 거부됩니다.

자세한 내용은 예제를 참조하십시오.

+0

나는 이것을 시도했지만 '로그인하십시오'라는 로그인 페이지로 사용자를 리디렉션하는 방법을 알 수 없습니다. –

+0

위의 편집을 참조하십시오 –

+0

고마워요.하지만 어떻게 사용자를 내 자신의 맞춤 오류 페이지로 리디렉션 할 수 있습니까? 내가 Webapp2 오류 처리기를 사용하려고했지만 캔트 그들에게 오류 401 작업을하거나 내 자신의 URL로 리디렉션 얻을. –