Sitecore:删除工作流状态中的“编辑”选项

时间:2014-11-19 14:52:45

标签: security workflow sitecore

我想设置一个工作流程,一旦用户进入某个状态,用户就无法编辑该项目。

根据Sitecore安全管理员食谱,工作流状态写权限 - 控制用户是否可以更新当前的项目 与特定工作流状态相关联。

我认为这将是完美的,但是,这是正确的,实际上也从项目中删除了所有工作流程命令。

基本上,在“正在审核”工作流状态中,用户应该只能选择“提交发布”或“拒绝”。拒绝操作,将项目返回到“草稿”的上一个工作流状态。提交发布,将工作流状态更改为“待批准”,发布者必须批准。编辑选项不应出现或被禁用。

我唯一的问题是,当项目处于“正在审核”时,编辑按钮仍然可用。当我修改“审阅”工作流状态的权限以拒绝编辑和/或工作流状态写入时,作者无法在项目上看到工作流程命令,并且他们会收到通知,表明他们没有对项目的编辑权限。

在某些时候,我能够以这样的方式设置权限,即我收到类似“此项目的工作流状态不允许编辑”的通知,但是我仍然可以看到并单击编辑按钮。我没有找到正确的安全设置来重新出现该通知。

谢谢,

诺娜

2 个答案:

答案 0 :(得分:0)

在查看显示工作流状态命令的工作流面板的代码时,没有任何逻辑可以对工作流写入访问进行验证。

我被迫创建一个新类并为工作流状态添加一个isAllow检查。 https://github.com/NDurham12/Fmcti.SharedSource.Workflow

我还要求Sitecore将此列为错误或功能请求。

答案 1 :(得分:0)

实际上,我刚才已经向Sitecore提出了这方面的支持,他们给了我以下解决方案:

当用户具有对项目的“读取”和“写入”访问权限以及“工作流状态写入”对工作流状态的访问权限时,可以在工作流中批准项目。 这些要求由设计规定。我将尝试注册一个关于允许开箱即用的这种行为的愿望。

现在,您可以使用和自定义Workbox来解决此设计决策。

您可以尝试使用以下解决方案:

  1. 允许对项目的“写入”访问权限和对当前工作流程的所有Worflow状态的“WorkflowStateWrite”访问权限,并拒绝访问“内容编辑器”(或“页面编辑器”)特定用户或角色。
  2. 拒绝“写入”对特定用户或角色的项目的访问权限,并自定义WorkboxForm类的“GetItems”方法(Sitecore.Shell.Applications.Workbox.WorkboxForm,Sitecore.Client)。 这将允许Workbox检索当前用户没有写入访问权限的项目。
  3. 例如:

    private DataUri[] GetItems(WorkflowState state, IWorkflow workflow)
    {
       ArrayList list = new ArrayList();
       DataUri[] items = workflow.GetItems(state.StateID);
       if (items != null)
       {
          foreach (DataUri uri in items)
          {
             Item item = Context.ContentDatabase.Items[uri];
    
             if (Sitecore.Context.User == "sitecore\Specific User")
             {
                if (((item != null) && item.Access.CanRead()) &&      (item.Access.CanReadLanguage() && item.Access.CanWriteLanguage()))
                {
                   list.Add(uri);
                }
             }
             else
             {
                 if ((((item != null) && item.Access.CanRead()) && (item.Access.CanReadLanguage() && item.Access.CanWriteLanguage())) && ((Context.IsAdministrator || item.Locking.CanLock()) || item.Locking.HasLock()))
                 {
                   list.Add(uri);
                 }
             }
           }
        }
    return (list.ToArray(typeof(DataUri)) as DataUri[]);
    }
    

    注意,您可能还想在Workbox中隐藏“打开”项或覆盖它的行为。我可以看到两种方法来实现这一点,我将为每种方法提供说明,以便您可以选择使用哪种方法。

    1. 打开WorkboxItem.xml文件(website / sitecore / shell / Applications / Workbox / WorkboxItem.xml)并注释掉以下行:
    2. <WorkboxCommand Icon="Applications/16x16/document_view.png" Header="Open" Command="$Click"/>
      

      但在这种情况下,所有用户都会隐藏“打开”按钮。

      1. 您需要自定义“Open”方法的逻辑(Sitecore.Shell.Applications.Workbox.WorkboxForm类)。
      2. 例如:

        protected void Open(string id, string language, string version)
        {
           string sectionID = RootSections.GetSectionID(id);
           UrlString str2 = new UrlString();
           str2.Append("ro", sectionID);
           str2.Append("fo", id);
           str2.Append("id", id);
           str2.Append("la", language);
           str2.Append("vs", version);
        
           var application = "/sitecore/content/Applications/Content editor";
        
            Item item = Client.Site.Database.Items[application];
        
            if (item == null) SheerResponse.Eval("alert('You do not have access to the Content Editor')");
            else
            Windows.RunApplication("Content editor", str2.ToString());
        }
        

        请注意,这些所有代码示例都只是示例,也许最好让用户能够编辑内容 - 但只能使用一些允许的部分。