金字塔授权 - 自定义视图
pyramid authorization - customized views
目前我使用一个简单的 SQLAlchemy + URL Dispatch 身份验证设置(不使用金字塔的授权方法),也就是说,我只是在用户不能做某事时引发 HTTPForbidden(这些检查发生在不同的地方,包括验证变形等时)。
对于一个新项目,我想尝试使用金字塔的授权方法,但在自定义视图方面我遇到了困难。
目前的理解
- 每个视图(我使用
@view_config
装饰器)都可以有一个权限字符串。通常是 'read' 和 'write',但实际上可以是任何字符串。 Multiple permissions in view_config decorator?
- 每个用户可以有多个主体(从 SQLAlchemy + URL Dispatch tutorial 中收集)
- 主体和权限字符串之间的link是authorization policy,这意味着多个主体可以具有相同的权限字符串。
对于 the example 的博客文章等,这似乎相当精简,其中定义 __acl__
允许指定谁可以访问特定页面,并且 'everyone can read but only these two roles can edit' 有意义。
瓶颈
第 1 点。每个视图必须有一个且只有一个权限字符串似乎不是最佳选择。 link in point 1 就是一个很好的例子,其中必须使用 'readwrite' 权限字符串。
特别是我想创建一个策略,允许用户 A 和 B 都查看特定视图(项目列表),但用户 A 可以编辑该页面中的某些字段,而用户 B 可以编辑某些其他字段(可能重叠)。现在可以实现的方法:-
- 在我的表单验证(或 request.POST 检查)中,我可以 check if a user has permissions。
- 在我的表单生成中(我使用变形)我可以 运行 进行相同的检查以将某些字段标记为只读。
- 在我的模板中,我可以 运行 根据需要对 hide/show 字段进行相同的检查。
- 每个提交点击不同的 URLs,带有指定特定权限字符串的瘦视图并重定向回 POST 的原始页面(仅当视图授权通过时)。
前 3 个看起来相当笨拙,因为它们正是我之前所做的(除了现在我需要使用 has_permission
而不是手动检查 request.user.role 或 request.user.id ).
第四个在利用金字塔 authentication/authorization 方面似乎更 'correct',但为此目的需要一大堆新的 URLs、路线和视图。本质上增加了很多复杂性,我不能像我希望的那样通过使用金字塔的授权方法将其隔离在 security.py
中。
总结
关于授权如何让我的生活更轻松,我是否错过了一些事情,因为与我的手动检查相比,以上所有内容似乎都增加了开销和代码复杂性(我想摆脱它,因为这使得身份验证分布在整个过程中)我的代码,在模板中,在视图中,甚至有时在模型中)。
这是一个选项:您的视图受一般权限的保护,指定用户是否可以 view/submit 表单,然后您拥有更细化的权限,您可以在代码中手动检查这些权限:
@view_config(..., permission='view-kittens')
def view_kitten(request):
data = {}
kitten = fetch_kitten_from_db(request.matchdict['id'])
if request.has_permission('view-kitten-name'):
data['name'] = kitten.name
if request.has_permission('view-kitten-color'):
data['color'] = kitten.color
return data
@view_config(..., permission='edit-kittens')
def edit_kitten(request):
kitten = fetch_kitten_from_db(request.matchdict['id'])
if request.has_permission('edit-kitten-name'):
kitten.name = request.POST['name']
if request.has_permission('edit-kitten-color'):
kitten.color = request.POST['color']
kitten.save()
...
另一种选择是拥有更精细的视图函数集,每个函数都受单独权限的保护:
@view_config(..., permission='edit-kitten-name')
def edit_kitten_name(request):
...
@view_config(..., permission='edit-kitten-color')
def edit_kitten_color(request):
...
这可能不会很好地与 Deform 一起玩,但对于某种 AJAX 前端来说会很好。
目前我使用一个简单的 SQLAlchemy + URL Dispatch 身份验证设置(不使用金字塔的授权方法),也就是说,我只是在用户不能做某事时引发 HTTPForbidden(这些检查发生在不同的地方,包括验证变形等时)。
对于一个新项目,我想尝试使用金字塔的授权方法,但在自定义视图方面我遇到了困难。
目前的理解
- 每个视图(我使用
@view_config
装饰器)都可以有一个权限字符串。通常是 'read' 和 'write',但实际上可以是任何字符串。 Multiple permissions in view_config decorator? - 每个用户可以有多个主体(从 SQLAlchemy + URL Dispatch tutorial 中收集)
- 主体和权限字符串之间的link是authorization policy,这意味着多个主体可以具有相同的权限字符串。
对于 the example 的博客文章等,这似乎相当精简,其中定义 __acl__
允许指定谁可以访问特定页面,并且 'everyone can read but only these two roles can edit' 有意义。
瓶颈
第 1 点。每个视图必须有一个且只有一个权限字符串似乎不是最佳选择。 link in point 1 就是一个很好的例子,其中必须使用 'readwrite' 权限字符串。
特别是我想创建一个策略,允许用户 A 和 B 都查看特定视图(项目列表),但用户 A 可以编辑该页面中的某些字段,而用户 B 可以编辑某些其他字段(可能重叠)。现在可以实现的方法:-
- 在我的表单验证(或 request.POST 检查)中,我可以 check if a user has permissions。
- 在我的表单生成中(我使用变形)我可以 运行 进行相同的检查以将某些字段标记为只读。
- 在我的模板中,我可以 运行 根据需要对 hide/show 字段进行相同的检查。
- 每个提交点击不同的 URLs,带有指定特定权限字符串的瘦视图并重定向回 POST 的原始页面(仅当视图授权通过时)。
前 3 个看起来相当笨拙,因为它们正是我之前所做的(除了现在我需要使用 has_permission
而不是手动检查 request.user.role 或 request.user.id ).
第四个在利用金字塔 authentication/authorization 方面似乎更 'correct',但为此目的需要一大堆新的 URLs、路线和视图。本质上增加了很多复杂性,我不能像我希望的那样通过使用金字塔的授权方法将其隔离在 security.py
中。
总结
关于授权如何让我的生活更轻松,我是否错过了一些事情,因为与我的手动检查相比,以上所有内容似乎都增加了开销和代码复杂性(我想摆脱它,因为这使得身份验证分布在整个过程中)我的代码,在模板中,在视图中,甚至有时在模型中)。
这是一个选项:您的视图受一般权限的保护,指定用户是否可以 view/submit 表单,然后您拥有更细化的权限,您可以在代码中手动检查这些权限:
@view_config(..., permission='view-kittens')
def view_kitten(request):
data = {}
kitten = fetch_kitten_from_db(request.matchdict['id'])
if request.has_permission('view-kitten-name'):
data['name'] = kitten.name
if request.has_permission('view-kitten-color'):
data['color'] = kitten.color
return data
@view_config(..., permission='edit-kittens')
def edit_kitten(request):
kitten = fetch_kitten_from_db(request.matchdict['id'])
if request.has_permission('edit-kitten-name'):
kitten.name = request.POST['name']
if request.has_permission('edit-kitten-color'):
kitten.color = request.POST['color']
kitten.save()
...
另一种选择是拥有更精细的视图函数集,每个函数都受单独权限的保护:
@view_config(..., permission='edit-kitten-name')
def edit_kitten_name(request):
...
@view_config(..., permission='edit-kitten-color')
def edit_kitten_color(request):
...
这可能不会很好地与 Deform 一起玩,但对于某种 AJAX 前端来说会很好。