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

时间:2016-03-10 15:03:48

标签: google-app-engine google-oauth google-app-engine-python

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

我希望我的应用程序的某些部分由具有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

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

1 个答案:

答案 0 :(得分:1)

是的,您可以为此目的覆盖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路由和动态用户菜单。