到目前为止,我已经使用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
或者有更好的方法吗? (对不起,如果这是一个基本问题,我以前从未这样做过)
答案 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路由和动态用户菜单。