我有5种类型的用户:
这是一种分层设置,其中每个用户都拥有每个在先用户的权限。要在我的项目中进行设置,我可以轻松地写出:
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...
?或者,这只是来自数据库的另一个查询,其中存储了用户的组?
案例和观点,我的目标是拥有灵活的分层权限系统。这样做最有效的方法是什么?我读过的教程只涉及更简单的全局策略(我明白了)。我的部分问题是如何全面理解对象/实例级安全性。
感谢您的帮助。
答案 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)
大多数权限系统都包含用户和组。如果您根据自己的情况添加了组,则可以创建一个单独的组来添加所需的权限,然后添加要拥有这些权限的用户。您可以根据需要在组中添加和删除用户。
您还可以构建资源例外。例如,您可以向允许修改它的资源添加用户列表,而不管它们可能具有哪些其他权限。