你如何在夏娃实施现场级安全?
我正在使用Eve构建REST API并使用角色来保护特定的端点,但除此之外,我还需要强制实施特定的字段级访问规则。我有一个基本的users
端点以下模式:你如何在夏娃实施现场级安全?
users = {
'schema': {
Schema.NAME: {
'type': 'string',
'minlength': 1,
'maxlength': 32,
'required': True,
'unique': True
},
Schema.PASSWORD: {
'type': 'string',
'required': True
},
Schema.ROLE: {
'type': 'string',
'allowed': ['end user', 'manager', 'admin'],
'required': True
}
},
端点具有公共POST
访问,所以任何人都可以创建一个用户(即新用户可以创建自己的帐户)。最终用户可以更改自己的密码,管理员可以更改最终用户的密码,并且管理员可以更改最终用户的角色。
我没有看到用标准模式定义来做到这一点的方法。我还查看了Cerberus验证,但似乎并未支持跨多个文档的任何逻辑(即通过检查客户端是否被认证为管理员user
来验证最终用户的user
文档的修改)。
我实现我期待的效果通过添加事件挂钩:
app.on_insert += all_users_created_equal
app.on_pre_PATCH_users += restrict_role_updates_to_admins
...
def all_users_created_equal(resource, docs):
"""Ensure that all users are created as end users.
Managers and Admins must be granted these roles by an existing
manager or admin."""
if resource == 'users':
for doc in docs:
doc['role'] = 'user'
def restrict_role_updates_to_admins(request, lookup):
if 'role' in request.json:
users = app.data.driver.db['users']
user = users.find_one({'name': request.authorization.username})
if user and user['role'] != 'admin':
# Non-admins cannot update roles. Break the lookup to fail the request.
lookup['_id'] = None
但它哈克以失败请求与请求内容渣土。有没有更好的方法来实施现场级安全?或者,如果没有,是否有更好的方法来使用事件挂钩来告诉服务器失败请求?从钩子引发异常的确会导致请求失败,但异常会在服务器上传播,并且不理想。
是否有更好的方法来实施字段级安全性?
据我所知,目前没有支持现场级自定义访问控制的机制。如果有的话,你会找到它。
我建议你尽可能改变你的设计。我认为将访问控制机制与受到前夕支持的CRUD操作分开会更好。我的意思是,你可以开发一个服务器来控制访问。此访问控制服务器获取来自用户的所有请求并在您的体系结构中扮演中介角色。然后,如果某个请求与访问控制规则(您在问题中提到的)相符,则该请求将发送至CRUD服务器(eve服务器),并且可能会影响您的数据库。
该体系结构更简单,因为它将用户访问控制与CRUD操作分开并且可扩展,因为您可以在将来添加更多访问控制规则。
有趣的建议。我必须权衡这种分离的价值与添加的网络流量以及未嵌入这些访问控制的CRUD服务器的风险。访问控制服务器到CRUD服务器设置基本上类似于典型的Web服务器到数据库设置。感谢您的评论! – Riaz
使请求失败的更好方法是调用flask的中止函数。以下是文档示例(http://flask.pocoo.org/docs/0.12/quickstart/#redirects-and-errors)。 – gcw