用户只编辑自己的帖子。使用Plone权限

时间:2013-05-02 14:38:29

标签: plone zope

我有一个Plone网站并创建一个菜单项。

在共享标签中,我添加了可以发布主题的每个用户。

如何阻止user1编辑user2拥有的帖子?目前,user1可以编辑user2帖子。

以前我尝试创建一个组,将每个用户分配到该组并使用共享选项卡添加组,但这样一个用户编辑来自另一个用户的帖子。

2 个答案:

答案 0 :(得分:2)

只需减去(取消选中)共享标签的“可以编辑”权限即可。 所有项目的创建者也是所有者,所有者具有编辑权限,因此用户可以编辑自己的项目,但不能编辑其他项目。

更新(根据新评论):

要禁止对子文件夹添加权限,您需要打破Contributors-role的继承权,并将“Can add”权限分配给该角色。

然而,这似乎是不可能的。引用Martin Aspeli的文章“理解权限和角色”:

“目前(直到Plone 2.1,最有可能),本地角色可以在收益树中的较低级别添加,但不会被带走”。

所以你需要寻找另一种方法,正如Martijn已经建议的那样,你很可能想要使用自定义工作流程 - 假设是文件夹 - 内容类型以及应该允许添加到其中的所有类型(幸运的是,默认情况下,图像和文件继承其父级的状态,否则你可能不得不考虑一个多链工作流,但是值得一个新的帖子,或者 - 丑陋 - 创建contenttypes的副本只是为了给他们另一个工作流程)

在这种情况下,请执行以下操作:

  • http://developer.plone.org/content/workflow.html中的建议创建工作流程(我最近更新了,如果您有改进建议或自己做出贡献,请告诉我们。)

  • 在工作流程中添加“添加门户网站内容”权限(在ZMI中点击您的工作流程名称,然后点击权限标签,从下拉列表中选择)。

  • 对于工作流程中的每个州(点击州名称),取消选中“Aquire permission settings”,这样就可以打破Contibutors角色的继承。然后检查要为其授予权限的每个角色的“添加门户网站内容”权限,这至少是您案例中的所有者角色,您也可以管理者访问所有内容。

<强> UPDATE2:

另一个更具挑战性但恕我直言更好的方法可能是:

在你的contenttype的inititialization(=你的ct的类被调用)上触发一个脚本(fe带有contentrule / eventhandler / subscriber或你ct的类定义本身),它查找父进程的继承共享权限,阻止它们(__ac_local_roles_block__ = True)并重新分配所有角色,但是对于新生对象(您的文件夹内容类型),贡献者的角色。 这样可以避免创建一个全新的工作流程来解决这种情况。

要执行此操作,请阅读文档(刚刚更新,欢迎评论),以了解如何注册事件处理程序:

http://developer.plone.org/components/events.html?highlight=events#example-register-an-event-handler-on-your-contenttype-s-creation

执行的python脚本可以包含s.th.像:

from Acquisition import aq_parent

def inhibit_parent_inherited_contributor_role(self, event):
    """ Blocks local-roles on freshly created children in our
        contenttype and re-assigns all its parent's local-roles but
        'Contributor' to the child.
    """

        # Block all inherited local-permissions, also of grand-parents:
        self.__ac_local_roles_block__ = True

        # Get local-roles assigned to parent and only to parent:
        parent_roles = self.aq_parent.get_local_roles()

        # Iterate over each assigned user and group to get their roles:
        for userid, roles in parent_roles:

            # Provide a list variable, to collect the new roles:
            # of a group or user:
            new_roles = []

            # Iterate over the user's, respectively group's, roles:
            for role in roles:

                # Exclude 'Contributor' of new role-list:
                if role != u'Contributor':

                    # Add all other roles to list of new roles:
                    new_roles.append(role)

            # Finally assign new roles to the child for each found user and group:
            self.manage_setLocalRoles(userid, new_roles)

免责声明:

我用IObjectEditedEvent对此进行了测试,效果很好。虽然IObjectAddedEvent被解雇了四次(为什么?)并且我无法快速驯服,但是plone.app.contentrules.handlers.py,确实:)仔细看看它,可能包括解决方案中的一个问题可以更好。

有关角色的深入代码示例,请参阅Andreas Jung的可爱zopyx.plone.cassandra及其computeRoleMap.py

我还没有看过collective.subtractiveworkflow。如果你这样做,请告诉我们:)

答案 1 :(得分:0)

如果您只想让用户编辑自己的内容,则需要将编辑限制为Owner角色。