据我所知,Sitecore 原生的安全模型在这方面存在不足。语言读/写访问不能本地化到内容树的给定部分。也就是说,如果您可以编辑一种语言,那么您可以对您具有写入权限的所有内容项执行此操作。
但是,我认为您可以结合使用 saveUi 管道和 getContentEditorWarnings 管道来满足您的要求。
保存UI
在此管道中,您需要一个处理器来检查用户是否应该能够以当前语言编辑给定内容。我将把它留给您如何配置/确定(XML 配置?用户访问内容树分支中特定于语言的项目?),但如果应该拒绝用户访问,您可以阻止节省。
public class CheckLanguageWritePermission
{
public string WorkflowStateID { get; set; }
public void Process(SaveArgs args)
{
Assert.ArgumentNotNull(args, "args");
Assert.IsNotNull(args.Items, "args.Items");
foreach (SaveArgs.SaveItem item in args.Items)
{
Item item2 = Sitecore.Client.ContentDatabase.Items[item.ID, item.Language];
if (/* user should not have permission*/)
{
AbortSave(args);
return;
}
}
}
protected void AbortSave(SaveArgs args)
{
if (args.HasSheerUI)
{
SheerResponse.Alert("You do not have permission to edit this item in the current language.");
SheerResponse.SetReturnValue("failed");
}
args.AbortPipeline();
}
}
获取内容编辑器警告
由于您无法阻止用户使用这种方法实际编辑内容(只是保存它),因此您可能应该提供一个警告,说明这一点。
public class CheckLanguageWritePermission
{
// Methods
public void Process(GetContentEditorWarningsArgs args)
{
Item item = args.Item;
if (/* user should not have permission*/)
{
GetContentEditorWarningsArgs.ContentEditorWarning warning = args.Add();
warning.Title = "You do not have permission to edit this item in the current language.";
warning.IsExclusive = true;
}
}
}
这不是一个完美的解决方案,但它确实可以防止对内容进行不必要的编辑。如果版本控制/工作流程在起作用,您可以通过覆盖 item:addversion 和 item:checkout 的 UI 命令来完全阻止添加新版本。
确定访问权限可能很棘手,最好的方法取决于您的特定业务规则。