【问题标题】:Having trouble with "fine-grained" Pyramid ACL“细粒度”金字塔 ACL 遇到问题
【发布时间】:2014-03-22 05:20:49
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

    标签: python acl pyramid


    【解决方案1】:

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

    首先,您应该使用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 和 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 模块中找到检查权限的有用函数。

    【讨论】:

      【解决方案2】:

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

      您还可以在资源中构建例外。例如,您可以将用户列表添加到允许修改它的资源,而不管他们可能拥有什么其他权限。

      【讨论】:

        猜你喜欢
        • 2019-01-20
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        相关资源
        最近更新 更多