我如何使用 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 路由和动态用户菜单。
到目前为止,我已经使用 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 路由和动态用户菜单。