用户身份验证最佳做法

时间:2014-05-19 10:45:32

标签: python google-app-engine webapp2

我在GAE上有一个应用程序,用于检查管理员在调用任何网页之前是否已登录。我已经尝试了各种方法来管理登录过程。

Q1 - 我在第二个例子中的装饰师做错了什么? Q2 - 是否通常会对帖子功能进行检查?

在每个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')

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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登录   page,如果使用OpenID身份验证,则为/ _ah / login_required。该   登录后,用户将被重定向回应用程序URL   创建一个帐户。未经授权。该请求被拒绝   HTTP状态代码为401,并显示错误消息。

在文档的下方,您将看到示例。

答案 2 :(得分:1)

作为您自己的装饰者的替代品或通过app.yaml保护。

webapp2(您正在使用)具有处理程序,以便处理程序执行您需要的操作

请参阅https://webapp-improved.appspot.com/api/webapp2_extras/appengine/users.html