限制sitecore发布

时间:2016-06-06 14:23:57

标签: security sitecore publishing sitecore7.2

我正在尝试在我的Sitecore实例中设置一些限制,以便只有在网站子部分中创建项目的权限的用户也具有发布权限,但只能发布他们创建内容的项目权限。

例如,我的内容类似于以下内容:

Sitecore
|- Content
    |- Home
        | - WhatWeDo
            | - Infrastructure
            | - Training
        | - Locations
            | - Europe
            | - North America

我已将Everyone角色设置为对内容树中的所有项目具有读取权限,并且我已明确指定拒绝写入,重命名,创建和删除权限

我已经设置了一个角色,“WhatWeDo”并且已被授予对WhatWeDo及其后代项目的写入,重命名,创建和删除权限。

现在,如果我将“WhatWeDo”角色添加到客户端发布角色,那么被授予“WhatWeDo”角色的用户也可以发布,但他们可以在内容树中发布任何项目。即显示“发布”功能区上的“发布”按钮。

大多数情况下,当我尝试使用谷歌搜索时,他们正在谈论发布限制。即发布设置对话框,但在这种情况下,这对我没用。

我找到了这个https://stackoverflow.com/a/6351649/1442308,但我似乎无法使其工作,我怀疑它与Sitecore的旧版本有关,不再适用。

我还更新了我的配置,以便只有具有读写权限才能发布发布

  <setting name="Publishing.CheckSecurity" > 
    <patch:attribute name="value" value="true" />
  </setting>    

但这对限制发布内容树项目的用户没有影响,因为用户仍然可以在内容树的“位置”部分中发布项目。即发布按钮仍然可以在“发布”功能区上看到。

我需要对此进行限制,以便那些被授予“WhatWeDo”角色的用户只能发布项目WhatWeDo及其后代,并且无法在内容树中发布任何其他项目。即,当它们位于WhatWeDo项目或其任何后代时,它们应该只有发布按钮可见。

更新

更新了一些问题,以便更清楚地确保我希望确保发布按钮在功能区栏上不可见。

3 个答案:

答案 0 :(得分:5)

在执行发布期间使用Publishing.CheckSecurity设置,因此只有用户有权访问的项才会实际发布。它不会影响对发布功能区按钮的访问。

通常,人们使用工作流来实现您的目标。使用发布操作设置工作流程。初始安装提供的示例工作流程提供了一个示例。然后,您可以限制对工作流命令的访问。

<强>更新

开箱即用的示例工作流程具有使其工作所需的一切。它具有命令和自动发布操作以及应用于Sitecore客户端创作角色的安全设置。

sample workflow security

由于您已经对内容项应用了安全性,因此您需要做的就是将这些项分配给示例工作流。您可以复制它并根据需要重命名。您还可以将“批准”命令重命名为“发布”。

要确保功能区中不显示标准发布按钮,请确保这些用户不是Sitecore客户端发布角色的成员。

答案 1 :(得分:0)

(抱歉,我还没有启用评论选项。)

我肯定会选择工作流程选项。正如评论中提到的,“发布”按钮将通过安全权限启用,但作为一般功能,不依赖于项目权限。如果您不希望显示“发布”按钮而不进行精美的自定义,则应该忘记此选项。

用户可以使用工作流程按钮触发“审核”选项卡下的发布操作,而不是传统的“发布”按钮。对于最终用户来说,这不会有太大变化。它甚至会让他们习惯于工作流操作,您可以在项目的后期进一步使用和优化。您可以借此机会在项目中介绍它们,而且它完全符合您的需求。

不要犹豫,询问您是否需要有关如何设置此类工作流程的更详细说明。

答案 2 :(得分:0)

对于用户无法访问的项目,无法隐藏功能区中的发布按钮,但使用规则引擎来控制是显示按钮还是非常简单不。它需要一些编码,但没有办法解决这个问题。

您可以在这些博文中找到更多信息,但由于规则引擎中的更改,Sitecore 7.1+存在一些差异:

<强> 1。创建规则操作类

在Visual Studio项目中,按照第一篇博文中的说明创建CommandRuleContextSetCommandState类。

<强> 2。在Sitecore中创建规则

这是Sitecore 7.1+中有很多更新的地方,第三篇博文解释了规则引擎的新结构:

  1. /sitecore/system/Settings/Rules/Definitions/Tags下创建一个名为Command State的新标记

  2. /sitecore/system/Settings/Rules/Definitions下创建一个名为Command States的新文件夹,并添加步骤1.14中显示的4个州

  3. 在名为/sitecore/system/Settings/Rules/Definitions/Elements的{​​{1}}下创建一个新的元素文件夹

  4. 在此文件夹下插入新的Command Rules。将字段值设置为:

    文字: Action

    输入: set command state to [commandstateid,Tree,root=/sitecore/system/Settings/Rules/Definitions/Command States,specific command state]

  5. 选择MyProject.Custom.Commands.SetCommandState, MyProject.Custom项,然后从标签列表中选择Tags/Default。这是我们之前定义的标签。

  6. 现在在Command State下插入一个新的&#34;规则上下文文件夹&#34;调用/sitecore/system/Settings/Rules,然后在Rules文件夹中添加新规则。

  7. 在创建规则之前,我们需要关联标记以显示条件和操作。选择&#34;标签/默认&#34;再次提交项目,此时选择Command RulesCommand State。如果要使用不同的条件(例如,项目层次结构,项目信息,安全性等),您可以选择不同的标签

  8. 现在使用您需要的条件创建规则,例如

  9. Rule Description

    第3。更新命令以使用规则

    我们需要更新Publish按钮命令的代码以使用我们定义的规则。

    创建一个继承自现有Publish命令的新命令类:

    Item Security

    现在我们可以修改此命令而不是默认命令:

    using Sitecore.Data.Items;
    using Sitecore.Diagnostics;
    using Sitecore.Rules;
    using Sitecore.SecurityModel;
    using Sitecore.Shell.Framework.Commands;
    
    namespace MyProject.Custom.Commands
    {
        public class PermissionBasedPublish : Sitecore.Shell.Framework.Commands.PublishNow
        {
            public override CommandState QueryState(CommandContext context)
            {
                Assert.ArgumentNotNull(context, "context");
                var state = base.QueryState(context);
                if (state != CommandState.Enabled)
                    return state;
    
                return RunRules(context);
            }
    
            private CommandState RunRules(CommandContext context)
            {
                Item parentRuleItem;
    
                var ruleContext = new CommandRuleContext();
                ruleContext.Item = context.Items[0];
    
                using (new SecurityDisabler())
                {
                    parentRuleItem = ruleContext.Item.Database.GetItem("/sitecore/system/Settings/Rules/Command Rules/Rules");
                    if (parentRuleItem == null)
                        return CommandState.Enabled;
                }
    
                RuleList<CommandRuleContext> rules = RuleFactory.GetRules<CommandRuleContext>(parentRuleItem, "Rule");
    
                if (rules == null)
                    return CommandState.Enabled;
    
                rules.Run(ruleContext);
                return ruleContext.CommandState;
            }
        }
    }
    

    发布按钮的可见性现在基于已定义的规则。使用上面定义的规则,只有当用户具有对当前项目的写访问权时,该按钮才可见。

    用户仍需要使用相应角色的发布权限。请注意,使用开箱即用角色意味着用户也可以从下拉列表中访问“发布站点”选项。您需要根据需要限制对Core数据库中的<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:set="http://www.sitecore.net/xmlconfig/set/"> <sitecore> <commands> <command name="item:publishnow"> <patch:attribute name="type">MyProject.Custom.Commands.PermissionBasedPublish, MyProject.Custom</patch:attribute> </command> </commands> </sitecore> </configuration> 和桌面上的快捷方式的访问。

    您可能还希望将其与/sitecore/content/Applications/Content Editor/Menues/Publish/Publish Site设置相结合,方法是将其设置为 true

    我要补充说,将用户发布权限作为一般规则是一个坏主意IMO,因为每次发布,即使是单个项目(这包括自动发布工作流程)也会清除HTML缓存并可能导致性能问题。