【问题标题】:User edits only its own post.Using Plone permisisons用户只编辑自己的帖子。使用电话权限
【发布时间】:2013-05-14 16:33:48
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: plone zope


    【解决方案1】:

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

    更新(根据新评论):

    要禁止对子文件夹的添加权限,您需要破坏分配了“可以添加”权限的贡献者角色的继承。

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

    “目前(最有可能在 Plone 2.1 之前),本地角色可以添加到获取树的较低级别,但不能删除”。

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

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

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

    • 将“添加门户内容”权限添加到您的工作流程(在 ZMI 中单击您的工作流程名称并点击权限选项卡,从下拉列表中选择它)。

    • 对于工作流程中的每个状态(单击状态名称),取消选中“获取权限设置”,这样您就破坏了 Contibutors 角色的继承。然后检查您要授予的每个角色的“添加门户内容”权限,在您的情况下,这至少是所有者角色,并且您的经理也可以访问所有内容。

    更新2:

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

    在您的内容类型初始化时(=调用您的 ct 的类)触发一个脚本(例如,使用 contentrule/eventhandler/subscriber 或在您的 ct 的类定义中),该脚本查找父级继承的共享权限,阻止它们(__ac_local_roles_block__ = True)并再次重新分配所有角色,但贡献者的角色,用于新生对象(您的文件夹内容类型)。 这样可以避免创建一个全新的工作流程来解决这种情况。

    为此,请阅读文档(刚刚更新,欢迎 cmets),了解如何注册事件处理程序:

    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 确实如此:) 仔细看看它,也许在解决方案中包含一个 contentrule 会更好.

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

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

    【讨论】:

    • 感谢 Ida,它正在工作,现在 user1 不编辑 user2 的内容,但是如果 user2 在 user1 的帖子中输入,他可以添加页面、文件、图像等内容,我怎样才能阻止他添加任何内容输入另一个用户的帖子?我确实从灵巧类型创建了一个菜单项,并指定只能添加文件夹类型,因此一旦创建文件夹并且用户进入文件夹,他就可以添加其他类型(文件图像,页面)
    • 嗨 Ida,我是 plone 新手,很久以前就使用 zope,我想了解更多关于在我的 contenttype 初始化时触发脚本的信息。它是怎么做的?提前谢谢
    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 2018-03-06
    • 1970-01-01
    • 2014-04-23
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多