python - Pyramid 授权-定制 View

标签 python authorization pyramid

目前我使用简单的 SQLAlchemy + URL Dispatch 身份验证设置(不使用 Pyramid 的授权方法),也就是说,当用户无法执行某些操作时,我只是引发 HTTPForbidden (这些检查发生在不同的地方,包括验证变形时,等)。

在一个新项目中,我想尝试使用 Pyramid 的授权方法,但在自定义 View 方面遇到了困难。

目前的理解

  1. 每个 View (我使用 @view_config 装饰器)都可以有一个权限字符串。通常是“读”和“写”,但实际上可以是任何字符串。 Multiple permissions in view_config decorator?
  2. 每个用户可以拥有多个主体(从 SQLAlchemy + URL Dispatch tutorial 收集)
  3. 主体和权限字符串之间的链接是 authorization policy ,这意味着多个主体可以具有相同的权限字符串。

这对于 the example 来说似乎相当精简。博客文章等,其中定义 __acl__ 允许指定谁可以访问特定页面,并且“每个人都可以阅读,但只有这两个角色可以编辑”是有意义的。

瓶颈

第 1 点:每个 View 都必须有一个且只有一个权限字符串,这似乎不是最佳选择。 link in point 1就是一个典型的例子,必须使用“读写”权限字符串。

特别是,我想创建一个策略,允许用户 A 和 B 都可以查看特定 View (项目列表),但用户 A 可以编辑该页面中的某些字段,而用户 B 可以编辑某些字段其他字段(可能重叠)。现在可以实现这一点的方法:-

  1. 在我的表单验证(或 request.POST 检查)中,我可以 check if a user has permissions .
  2. 在我的表单生成中(我使用变形),我可以运行相同的检查以将某些字段标记为只读。
  3. 在我的模板中,我可以根据需要运行相同的检查来隐藏/显示字段。
  4. 每次提交都会点击不同的 URL,瘦 View 会指定特定的权限字符串并重定向回 POST 的原始页面(仅当通过 View 授权时)。

前 3 个看起来相当笨重,因为它们正是我之前所做的(除了现在我需要使用 has_permission 而不是检查 request.user.role 或 request.user.id手动)。

第四种方法在利用 Pyramid 身份验证/授权方面似乎更“正确”,但为此目的需要一大堆新的 URL、路由和 View 。本质上增加了很多复杂性,我不能像我希望使用 Pyramid 的授权方法那样将其隔离在 security.py 中。

摘要

我是否错过了授权如何让我的生活更轻松的事情,因为与我的手动检查相比,以上所有内容似乎都增加了开销和代码复杂性(我想摆脱它,因为这使得身份验证分布在我的代码中) ,在模板中,在 View 中,甚至有时在模型中)。

最佳答案

这里有一个选项:您的 View 受到通用权限的保护,该权限指定用户是否可以查看/提交表单,然后您可以在代码中手动检查更细化的权限:

@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 功能集,每个功能都受到单独权限的保护:

@view_config(..., permission='edit-kitten-name')
def edit_kitten_name(request):
    ...

@view_config(..., permission='edit-kitten-color')
def edit_kitten_color(request):
    ...

这可能不能很好地与 Deform 配合使用,但对于某种 AJAX 前端来说就很好了。

关于python - Pyramid 授权-定制 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42234004/

相关文章:

postgresql - SQLite 到 PostgreSQL 仅数据传输(以维护 alembic 功能)

python - Pyramid 项目: "ValueError: Variable assignment..." when trying to pserve

python - 在哪里放置 ColanderAlchemy+Pyramid 的自动 setup_schema

python - 计算多变量函数在 Python 中的间隔之间取值的有效方法

python - Pygame 没有在窗口中显示任何内容

python - ConfigParser 的新行?

python - 在 python 脚本中检查正在运行的 python 脚本

java - 监听所有请求 Tomcat

c# - MVC5 ASP 身份动态授权属性

scope - 微服务架构中的授权