gpt4 book ai didi

python - 遇到 "fine-grained" Pyramid ACL 问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:56 24 4
gpt4 key购买 nike

我有 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

这适用于大多数 实例。但是,我不确定如何最好地完成以下操作:

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

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

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

感谢您的帮助。

最佳答案

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

首先,您应该使用 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 和 child 的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com