我需要根据一些角色授权用户,所以我需要:
class Things:
@falcon.before(myfunc, 'can_delete_tag')
@on_get(req, resp):
...
但似乎不可能......有什么想法吗?
我需要根据一些角色授权用户,所以我需要:
class Things:
@falcon.before(myfunc, 'can_delete_tag')
@on_get(req, resp):
...
但似乎不可能......有什么想法吗?
除非我们修补 falcon 的功能,否则使用内部 falcon 钩子是不可能的。因为 falcon 中的钩子根本不接受任何参数。但是一个标准的装饰器可以做到这一点:
def Authorize(action):
def request_checked(func):
def _f(self, req, resp, *args, **kw):
u = getUserInfoFromSession(req)
if isAuthorizedTo(u.get('id'), action):
return func(self, req, resp, *args, **kw)
else:
raise falcon.HTTPUnauthorized('Not Authorized', 'Permission Denied')
return _f
return request_checked
现在我们可以使用它了:
class Things:
@Authorize('can_delete_tag')
@on_get(req, resp):
...
Falcon 1.3 似乎也有同样的限制!这是一个解决方法
import falcon
class HasPermission(object):
def __init__(self, role_name):
self.role_name = role_name
def validate_has_role(self, req, resp, resource, params):
raise falcon.HTTPBadRequest('Bad request')
并使用它......
class Things:
@Authorize('can_delete_tag')
@on_get(req, resp):
...
write_access = HasPermission("WRITE").validate_has_role
read_access = HasPermission("READ").validate_has_role