python - "fine-grained" Pyramid ACL 出现问题

标签 python acl pyramid

我有 5 种类型的用户:

  1. 管理员     (全部权限)
  2. 创建者   (权限“v”、“a”、“m”、“c”)
  3. 管理员(权限“v”、“a”、“m”)
  4. 分析师(权限“v”、“a”)
  5. 查看者    (权限“v”)

这是一个分层设置,其中每个用户都拥有前面每个用户的权限。要在我的项目中进行设置,我可以轻松编写:

class RootFactory(object):

    __acl__ = [ 
        (Allow, '__ADMIN__', ALL_PERMISSIONS),
        (Allow, 'creator',  ('VIEWER', 'ANALYST', 'MANAGER', 'CREATOR')),
        (Allow, 'manager',  ('VIEWER', 'ANALYST', 'MANAGER')),
        (Allow, 'analyst',  ('VIEWER', 'ANALYST')),
        (Allow, 'viewer',   ('VIEWER')),
        (Allow, Everyone, NO_PERMISSION_REQUIRED) 
    ]

    def __init__(self, request):
        self.request = request

然后,在我的views.py中,例如,我这样做:

@view_config(route_name='mgmt_handler', renderer='manage.jinja2', permission='MANAGER')
def mgmt_handler(request):
    pass  # do stuff

这对于大多数实例来说效果很好。但是,我不确定如何最好地完成以下任务:

  • 如何通过允许查看者 user1 根据需要拥有某些更高的权限来使此访问控制更加“细粒度”?这是否属于“对象级”安全领域?在大多数情况下,全局根工厂就足够了,但是如何适应低层用户被授予更高权限或高层用户被拒绝较低权限的情况?

    <
  • 有没有一种方法可以方便地确定特定用户的原则,以便在我看来我可以说出以下内容:if user.principle in list_of_permissions: do some...?或者,这只是来自存储用户组的数据库的另一个查询吗?

案例和观点,我的目标是拥有一个灵活的、分层的权限系统。最有效的方法是什么?我读过的教程仅涉及更简单的全局策略(我确实理解)。我的部分问题是如何全面理解对象/实例级安全性。

感谢您的帮助。

最佳答案

我不确定我是否清楚地了解您想要实现的目标。据我了解,您有一些用户组,对系统中的每个对象都具有通用权限,并且要调整特定用户对特定对象的访问权限。例如,对象的所有者拥有该对象的所有权限,无论所有者的用户组如何。

首先,您应该使用 location-aware resources 的层次结构。通过这种方式,您可以保留根资源中的默认权限并在子资源中调整它们:

class RootFactory(object):

    __name__ = ''
    __parent__ = None
    __acl__ = [ 
        (Allow, '__ADMIN__', ALL_PERMISSIONS),
        (Allow, 'creator',  ('VIEWER', 'ANALYST', 'MANAGER', 'CREATOR')),
        (Allow, 'manager',  ('VIEWER', 'ANALYST', 'MANAGER')),
        (Allow, 'analyst',  ('VIEWER', 'ANALYST')),
        (Allow, 'viewer',   ('VIEWER')),
        # (Allow, Everyone, NO_PERMISSION_REQUIRED) 
        # It seems, here you want to deny access for all other users, 
        # so you should use this:
        # (Deny, Everyone, ALL_PERMISSIONS)
        # or simply:
        DENY_ALL
    ]

    def __init__(self, request):
        self.request = request

    def __getitem__(self, name):
        return ChildObject(name, self)

然后在子对象构造函数中,您可以为这个特定对象添加特殊权限:

class ChileObject(object):

    def __init__(self, request, name, parent):
        self.__parent__ = parent
        self.__name__ = name
        # Do some stuff, for example loading object from DB 
        # and populate other attributes of the object.
        # Then add permission for the object's owner
        self.__acl__ = [(Allow, self.owner_id, ALL_PERMISSIONS)]

结果 ACL 将是根 ACL 和子 ACL 的合并版本,即:

[ 
    (Allow, self.owner_id, ALL_PERMISSIONS),
    (Allow, '__ADMIN__', ALL_PERMISSIONS),
    (Allow, 'creator',  ('VIEWER', 'ANALYST', 'MANAGER', 'CREATOR')),
    (Allow, 'manager',  ('VIEWER', 'ANALYST', 'MANAGER')),
    (Allow, 'analyst',  ('VIEWER', 'ANALYST')),
    (Allow, 'viewer',   ('VIEWER')),
    DENY_ALL 
]

关于你的第二个问题,你可以在pyramid.security中找到一个有用的检查权限的函数。模块。

关于python - "fine-grained" Pyramid ACL 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21921812/

相关文章:

python - 是否有 Pyramid 包用于在服务器端存储表单相关信息(避免镜像隐藏字段)?

python - 如何更改 Pyramid 项目的名称?

python - 为什么 Python 编译这段代码没有抛出错误?

python - 在列表理解中遇到生成器问题

java - Python 与 Java——您会选择哪个来进行并发编程,为什么?

mediawiki - MediaWiki 访问控制扩展的问题

scala - 使用文件系统在Scala中将数据从本地复制到远程hdfs位置时,hadoop权限被拒绝

python - Pyramid 和 python 请求库之间的奇怪行为

python - 将 Celery 用于管道

python - 谷歌日历API ACL