【问题标题】:Plone: How do I assign roles to users predicated on group membership?Plone:如何根据组成员身份为用户分配角色?
【发布时间】:2013-10-20 08:08:31
【问题描述】:

使用克隆 4.

我最后一次使用 plone 是在 5 年前,我对 python 生疏了,现在通常不认为自己是开发人员。我只是想知道我想要做的是:

  1. 无需编码即可。
  2. 如果没有,在我到达某个地方之前,我需要阅读哪些资源。

问题陈述:

我正在为一个中型学术组织开发一个克隆站点(它没有自己的 IT 部门并且通常不知道 CMS)。该组织有一名总领导。该组织分为 5 个组,由不同的用户组成。这 5 个组中的每个组都有一个组长。 plone 网站具有内部和外部发布工作流程(我认为它是一个附加组件)。

我在我的克隆网站上创建了 5 个组 (Group1-5) 来反映这种结构。我还创建了一个名为 GroupLeaders 的组,其中包含 5 个组的 5 个领导者。每个用户都有一个个人文件夹。此外,每个组都有一个组文件夹。还有一个整体组织文件夹。

读(r)/写(w)/内部发布(ip)/外部发布(ep)权限:

用户文件夹:用户(r w ip ep) 组文件夹:用户(r w),组长(r w ip ep) 组织文件夹:用户(r w)、组长(r w ip)、组织领导(r w ip ep)。

此外,组长也是其组的名义成员。最后,组织负责人属于 5 个组之一。组织负责人和小组负责人永远不是同一个人。

组长和组织长的身份在固定的 2 年之后发生变化。失去领导者身份后,用户将成为该组(用户)的简单成员。

我正在尝试实现以下工作流程:

任何组中的用户都可以在其个人文件夹(立即对外发布)中创建(任何类型的)文档。用户在组文件夹中创建的所有文档都必须由相关组长批准用于内部/外部发布。然而,仅仅加入 GroupLeaders 是不够的。只有第 2 组的 GroupLeader(比如说)应该能够批准/拒绝第 2 组的成员所做的编辑。所以,我需要类似(元代码):

If (成员属于 GroupLeader && 成员属于 Group 2) 将批准工作流分配给成员 结束

我该怎么做?

【问题讨论】:

    标签: permissions workflow plone roles


    【解决方案1】:

    您可以在全局和给定上下文中直接将角色分配给组。

    只需围绕角色而非群组设计您的工作流程。通过组成员身份,用户将在正确的上下文中拥有正确的角色。

    因此,在组文件夹中,将编辑角色分配给相应的Group 组,将审阅者角色分配给相应的GroupLeader 组。当组长从 GroupLeader 组中移除,并且另一个用户添加到该组时,角色会自动跟随。

    【讨论】:

    • 感谢您的回答。但是,这里的 GroupLeader 组由 5 人组成,其中只有一个人被允许担任他/她的组的审阅者角色(不应允许第 3 组的负责人审阅第 2 组的编辑)。显而易见的答案是我应该创建 5 个额外的组(Group1Leader、Group2Leader 等),每个组只包含一个组长。这是一个不整洁的解决方案。
    • 另一种方法是使用borg.localrole 根据组成员身份计算动态组;所以根据Group1GroupLeaders 的成员资格产生Group1Leader。不过,对于只有 5 位领导者,我确实认为这太过分了。
    • IIRC,borg 已被弃用或不再推荐,不是吗?
    • @IdaEbkes:borg-the-project 是,但 borg.localrole 是我们 Jarn 非常依赖的那个项目的衍生产品,效果很好。
    • Overkill 不是我喜欢用来描述我的工作的形容词 :) 使用 borg.localrole(我假设它是一个附加组件)真的很复杂并且会破坏工作流程吗?
    【解决方案2】:

    按照 Martijn 的回答后,将以下内容作为“Script before”添加到转换“publish_internally”和“publish_externally”:

    pu=context.plone_utils
    
    current_user_group_memberships = pu.portal_membership.getAuthenticatedMember().getGroups()
    groups_with_locally_assigned_write_permission = []
    
    # Get all local role-assignments of object:
    local_roles=context.acl_users.getLocalRolesForDisplay(context)
    inherited_local_roles=pu.getInheritedLocalRoles(context)
    all_local_roles = local_roles + inherited_local_roles
    
    # Of these assignments, collect groups with write-permissions:
    for role in all_local_roles:
        if role[2] is 'group' and 'Contributor' in role[1] or 'Editor' in role[1]:
            groupname = role[0]
            if groupname not in groups_with_locally_assigned_write_permission:
                groups_with_locally_assigned_write_permission.append(groupname)
    
    # Now, we compare, if the user is a member of one of these groups:
    for group in groups_with_locally_assigned_write_permission:
    
        # Is member of an assigned group:
        if group in current_user_group_memberships:
            return True
    
        # Not groupmember, but in orgafolder should be able to publish internally:
        #elif [CONTEXT_IS_ORGAFOLDER] and transition=='publish_internally':
        #    return True
    
        # Neither of conditions applied, continue for-loop:
        else:
            pass
    
    # For-loop ended and didn't bring good news:
    return False
    

    您仍然需要找到一种方法来识别上下文是否是组织文件夹并将其插入占位符 [CONTEXT_IS_ORGAFOLDER]。

    我想提一下,zopyx.plone.cassandra 对理解权限的存储有很大帮助。

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 1970-01-01
      • 2016-11-09
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      相关资源
      最近更新 更多