2014-05-19 186 views
0

我有一个GAE应用程序,用于在调用任何网页之前检查管理员是否已登录。我已经尝试过各种方法来管理登录过程。用户身份验证最佳实践

Q1 - 我在做例子二中的装饰器时会出现什么问题?
Q2 - 有人通常会检查函数吗?

在每个get函数中使用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

谢谢,但该回复于不工作要么。 –

+0

您将无法访问修饰器中当时的回复。 'args'中的第一个参数将会是'self',所以你需要把它拉出来并且从中调用响应。它可能看起来像'args [0] .response。写()' –

+0

我最后一个问题,我需要使用我的职位功能? –

4

如果处理程序的所有用户都必须登录并admin,那么你就可以在app.yaml中,而不是在你的代码中指定的限制。

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工作,也没有得到它重定向到我自己的网址。 –

相关问题