我如何使用 Google 帐户管理 GAE 中的授权?

How can I manage authorization in GAE using Google Accounts?

到目前为止,我已经使用 oauth2 通过 Google 帐户为我的应用程序管理身份验证,这为我提供了一些数据来完成基本配置文件。问题是我现在想要管理权限以查看和编辑应用程序中的大量内容,不同的人群能够 view/edit 应用程序的不同部分。

我希望我的应用程序的某些部分可以被具有 A 权限的用户访问,一些用户可以访问 B、C 等。我开始这样做的方法是在 get 和 post 方法中使用装饰器每个处理程序,像这样:

class SomeHandler(Handler):
    @validate_access
    def get(self):
        pass

    @validate_access
    def post(self):
        pass

其中@validate_access只有在用户有权限的情况下才执行函数中的代码,否则返回授权错误。前一段时间这似乎是一个很好的解决方案,但是由于有很多处理程序,我必须在任何地方都使用那个装饰器,这很烦人而且很危险,因为我可能会忘记将它放在某些函数中。

有没有办法将此验证放在基本处理程序的初始化中,这样我就不必在任何地方都使用那个装饰器了?我想象这样的事情:

class BaseHandler(webapp2.RequestHandler):

def initialize(self, request, response):
    super(Handler, self).initialize(request, response)

    self.user = users.get_current_user()
    employee = Employee.query(user_id=self.user.user_id).get()

    if employee.auth_level > 3:
        #See the content: Do whatever the "get" method of the corresponding handler does.
        pass
    else:
        #Raise authorization error
        pass

或者有更好的方法吗? (对不起,如果这是一个基本问题,我以前从未这样做过)

是的,您可以为此覆盖 webapp2 调度处理程序。我使用这种方法来实施基于角色的访问控制 (RBAC)。

示例代码:

class BaseHandler(webapp2.RequestHandler):
    """ webapp2 base handler """

    def dispatch(self):

        # UserAccess aborts if the user does not have permission to use a handler 
        UserAccess(self.request)
        super(BaseHandler, self).dispatch()
        .... 


class ExampleHandler(BaseHandler):

    def get(self):

        .....

我使用的配置文件包含允许的处理程序角色。该文件还用于创建 webapp2 路由和动态用户菜单。