遇到“细粒度”金字塔ACL问题

时间:2014-02-20 23:15:17

标签: python acl pyramid

我有5种类型的用户:

  1. 管理员(权限所有)
  2. 创作者(权限“v”,“a”,“m”,“c”)
  3. 经理(权限“v”,“a”,“m”)
  4. 分析师(权限“v”,“a”)
  5. 查看者(权限“v”)
  6. 这是一种分层设置,其中每个用户都拥有每个在先用户的权限。要在我的项目中进行设置,我可以轻松地写出:

    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 something...?或者,这只是来自数据库的另一个查询,其中存储了用户的组?

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

    感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

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

首先,您应该使用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将是root的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模块中的权限。

答案 1 :(得分:0)

大多数权限系统都包含用户和组。如果您根据自己的情况添加了组,则可以创建一个单独的组来添加所需的权限,然后添加要拥有这些权限的用户。您可以根据需要在组中添加和删除用户。

您还可以构建资源例外。例如,您可以向允许修改它的资源添加用户列表,而不管它们可能具有哪些其他权限。