用户身份验证最佳做法

问题描述 投票:0回答:3

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

问题 1-示例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')
python google-app-engine webapp2
3个回答
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

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和错误消息。

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


1
投票

替代您自己的装饰器或通过app.yaml进行保护。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.