跳转到主要内容

允许定义本地权限

项目描述

摘要

此立方体允许使用通用的 CWPermission 实体类型来定义本地权限,您应在您的模式定义中使用它。

CWPermission 实体类型

  • 有一个名称和一个标签

  • 表示通过“require_group”关系与之链接的组具有通过“require_permission”对象关系链接的实体的 <name> 权限。

为了加快速度,自动维护了一个“has_group_permission”关系,所以“P require_group G, U in_group G”等价于“U has_group_permission P”。

客户端立方体应明确为应该具有本地权限的每个类型添加“X granted_permission CWPermission”和“X require_permission CWPermission”,第一个是明确授予的,而第二个是自动传播的。因此,granted_permission的可能主题应该是require_permission的可能主题的子集。

您应在您的模式安全定义中使用require_permission,因为这是自动传播的一个。

配置示例

class granted_permission(RelationDefinition):
    subject = 'Project'
    object = 'CWPermission'

class require_permission(RelationDefinition):
    subject = ('Project', 'Version')
    object = 'CWPermission'

class Project(EntityType):
    """a project, only visible to managers and users having the 'view' local permission
    """
    __permissions__ = {
       'read':   ('managers', ERQLExpression('X require_permission P, P name "view", '
                                             'U has_group_permission P'),),
       'update': ('managers', 'owners',),
       'delete': ('managers', ),
       'add':    ('managers', 'users',),)
       }

class Version(EntityType):
    """a version defines the content of a particular project's release"""
    __permissions__ = {
       'read':   ('managers', ERQLExpression('X require_permission P, P name "view", '
                                             'U has_group_permission P'),),
       'update': ('managers', 'owners',),
       'delete': ('managers', ),
       'add':    ('managers', 'users',),)
       }

class version_of(RelationDefinition):
    """link a version to its project. A version is necessarily linked to one and
    only one project.
    """
    __permissions__ = {
       'read':   ('managers', 'users',),
       'delete': ('managers', ),
       'add':    ('managers', RRQLExpression('O require_permission P, P name "manage",'
                                             'U has_group_permission P'),)
                   }
    subject = 'Version'
    object = 'Project'
    cardinality = '1*'

此配置表示我们有两个不同的权限(即将到来的CWPermission实体)

  • 一个名为“view”,允许一些用户查看特定的项目和其版本

  • 另一个名为“manage”,提供在项目上创建新版本的权利

现在的想法是,经理将为项目授予权限,然后这些权限将按配置进行传播。您希望使用 cubicweb_localperms.hooks 中的集合来配置当需要时权限应如何传播。在我们的示例中,在您的cube的 hooks.py 中添加如下内容:

from cubicweb_localperms import hooks
# relations where the "main" entity is the object. We could also
# have modified hooks.S_RELS for relations where the "main" entity
# is the subject
hooks.O_RELS.add('version_of')

项目被授予的权限将在创建/删除版本时自动添加/删除。

最后但同样重要的是,在定义 Project 的实体类时,定义 __permissions__ 如下:

class Project(AnyEntity):
    __permissions__ = ('view', 'manage',)

这样,当访问项目的“安全”视图(默认情况下在“更多操作”子菜单中)时,您应该会看到一个接口来配置本地权限,其中包含预先填充的正确权限名称的组合框,而不是自由文本输入,这大大降低了错误的风险。

此外,您可以在 cubicweb_localperms 中找到一些函数,用于简化在方案定义中构建rql表达式。上述示例中的函数可以如下编写:

from cubicweb_localperms import xexpr, oexpr

class Project(EntityType):
    __permissions__ = {'read':   ('managers', xexpr('view'),),
                       'update': ('managers', 'owners',),
                       'delete': ('managers', ),
                       'add':    ('managers', 'users',),)
                       }

class Version(EntityType):
    __permissions__ = {'read':   ('managers', xexpr('view'),),
                       'update': ('managers', 'owners',),
                       'delete': ('managers', ),
                       'add':    ('managers', 'users',),)
                       }

class version_of(RelationDefinition):
    __permissions__ = {'read':   ('managers', 'users',),
                       'update': ('managers', 'owners',),
                       'delete': ('managers', ),
                       'add':    ('managers', oexpr('manage'),)
                      }

项目详细信息


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

cubicweb-localperms-1.0.0.tar.gz (15.6 kB 查看散列)

上传时间

构建分发

cubicweb_localperms-1.0.0-py3-none-any.whl (18.9 kB 查看散列)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面