【问题标题】:Restrict sitecore publishing限制站点核心发布
【发布时间】:2016-10-06 05:01:16
【问题描述】:

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

例如我有类似下面的内容:

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

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

我已设置角色“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 项或其任何后代中时才可以看到发布按钮。

更新

更新了问题,更清楚地表明我想确保发布按钮在功能区栏上不可见。

【问题讨论】:

    标签: security sitecore publishing sitecore7.2


    【解决方案1】:

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

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

    更新

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

    由于您已经对内容项应用了安全性,因此您只需将这些项分配给示例工作流程即可。如果需要,您可以复制它并重命名它。您还可以将 Approve 命令重命名为 Publish。

    为确保标准发布按钮不会出现在功能区中,请确保这些用户不是 Sitecore 客户端发布角色的成员。

    【讨论】:

    • 如果用户不应该发布,我希望隐藏功能区上的发布按钮。我做了一些测试。对于被赋予“WhoWeAre”角色的用户,他们可以看到位置项目的发布按钮。用户可以发布此项目,除非他们展开以在完成对话框中显示更多信息,否则他们不会看到该项目已被跳过的消息。大多数用户只会假设该项目已发布,然后会想知道为什么他们无法在实时站点上看到他们的更改。
    • 你真的不能用标准的发布按钮来做到这一点。发布功能区按钮的可见性由核心数据库中对其定义项的权限控制。它不会查看在内容编辑器中选择的项目。最好不要让用户访问该按钮,而是使用工作流。
    • 我认为@BenGolden 是对的。您无法真正根据他们有权访问的部分来选择谁可以看到“发布”按钮。 1. 创建一个实现您想要的规则引擎自定义规则。 2. 创建一个简单的工作流,其中包含两种状态(草稿和已批准)和一个在草稿状态下发布的操作。然后,您将此工作流程添加到您需要发布按钮的每个模板。之后,您创建一个名为发布者的角色并授予此工作流的权限。任何需要发布的人都应该有这个角色。如果您愿意,我可以提供第二个选项的详细信息
    • @Gabbar 如果您可以提供详细信息。由于太长无法进入的原因,我需要一个开箱即用的解决方案。我目前无法对此解决方案进行任何代码更改。谢谢
    • 谢谢。我现在有一些事情要回到我的客户那里讨论。现在就等他们的反馈
    【解决方案2】:

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

    我肯定会选择工作流选项。正如 cmets 中提到的,发布按钮将通过安全权限启用,但作为一般能力,不依赖于项目权限。如果您不想在不进行花哨的自定义的情况下显示“发布”按钮,则应该忘记此选项。

    用户将拥有触发发布操作的工作流按钮,而不是传统的发布按钮,位于“审阅”选项卡下。对于您的最终用户而言,它不会有太大变化。它甚至会让他们习惯工作流操作,您可以在以后的项目中进一步使用和改进。您可以借此机会在您的项目中引入它们,而且它完全适合您的需求。

    如果您需要有关如何设置此类工作流程的更详细说明,请随时询问。

    【讨论】:

      【解决方案3】:

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

      您可以在这些博文中找到更多信息,但由于规则引擎的更改,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 下创建一个名为Command Rules 的新元素文件夹

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

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

        类型: MyProject.Custom.Commands.SetCommandState, MyProject.Custom

      5. 选择Tags/Default 项目并从标签列表中选择Command State。这是我们之前定义的标签。

      6. 现在在/sitecore/system/Settings/Rules 下插入一个名为Command Rules 的新“规则上下文文件夹”,然后在规则文件夹中添加一个新规则。

      7. 在创建规则之前,我们需要关联标签以显示条件和操作。再次选择“Tags/Default”项,这次选择Command StateItem Security。如果您想使用不同的条件(例如项目层次结构、项目信息、安全性等),您可以选择不同的标签

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

      3.更新命令以使用规则

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

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

      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;
              }
          }
      }
      

      现在我们可以修补这个命令而不是默认的:

      <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>
      

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

      用户仍需要使用适当角色的发布权限。请注意,使用现成角色意味着用户也可以从下拉列表中访问“发布站点”选项。您需要在 Core 数据库中限制对 /sitecore/content/Applications/Content Editor/Menues/Publish/Publish Site 的访问,并酌情限制桌面快捷方式。

      您可能还希望将其与 Publishing.CheckSecurity 设置结合使用,方法是将其设置为 true

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

      【讨论】:

      • 谢谢。它非常详细,将尝试将其保存在我的takelit中以供将来参考。此链接chowson.github.io/… 显示了另一种基于写入权限隐藏发布按钮的方式。
      • 以前没见过,它本质上是相同的解决方案,除了逻辑在代码中很难烘焙。规则引擎允许更灵活地添加例外或进行更改。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多