2016-03-17 2 views
1

Есть ли какой-либо способ в Sitecore, который я могу создать роль/пользователь, который может просматривать и редактировать свои собственные созданные объекты? Если нет, как я могу сделать это возможным?Как вы можете установить безопасность, чтобы пользователь мог видеть или редактировать свои объекты только в Sitecore?

+0

Возможно, вы имеете в виду права на просмотр с видом? вам нужно увидеть родителя, прежде чем вы сможете создать или отредактировать элемент.о полях, которые вы можете отменить поле, читаемое полем –

+0

Пример: в редакторе содержимого есть 10 пользователей, которые могут создавать элементы из родительского элемента. Они могут редактировать и видеть свой собственный созданный дочерний элемент, но элементы, созданные другими пользователями, «скрыты». –

ответ

1

Чтобы исправить это, я добавил элемент: созданное событие в файле sitecore/events config.

<event name="item:created" xdt:Transform="Replace" xdt:Locator="Match(name)"> 
       <handler type="Sirano.Dev.ItemEventHandlers.CustomItemEventHandler, Sirano.Dev" method="OnItemCreated" /> 
</event> 

Это событие Виль запустить следующий код:

protected void OnItemCreated(object sender, EventArgs args) 
    { 
     if (args == null) 
     { 
      return; 
     } 
     var parameters = Event.ExtractParameters(args); 
     var item = ((ItemCreatedEventArgs)parameters[0]).Item; 
     if (item == null) 
     { 
      return; 
     } 

     var user = Sitecore.Context.User; 

     var accessRules = item.Security.GetAccessRules(); 

     accessRules.Helper.AddAccessPermission(user, 
      AccessRight.ItemRead, 
      PropagationType.Any, 
      AccessPermission.Allow); 

     accessRules.Helper.AddAccessPermission(user, 
      AccessRight.ItemWrite, 
      PropagationType.Any, 
      AccessPermission.Allow); 

     item.Editing.BeginEdit(); 
     item.Security.SetAccessRules(accessRules); 
     item.Editing.EndEdit(); 
    } 
0

Я только что закончил строительство этой самой функции. Хотя нет ничего вне коробки, существует целый ряд возможных путей решения этой в том числе:

  • пункт: сохранение обработчика событий (примечание «экономии» и не «спас», который происходит после того, как тот факт,), или
  • создать процессор для трубопровода saveUI, который выполняется при нажатии кнопки «Сохранить» выполняется в пользовательском интерфейсе, или, как мы пошли
  • создать процессор для getContentEditorWarnings трубопровода

Этот последний подход позволяет отключить пользовательский интерфейс Sitecore и отображать сообщение пользователю, но не мешает кодам или API изменять элементы, что было идеально для нас. Наш процессор принял список путей (в конфиге) в качестве подэлементов, которые позволили нам ограничить функциональность определенными областями сайта (мы контролировали доступ к панели управления маркетингом).

Вот выдержка из трубопровода <getContentEditorWarnings>, где мы ввели нашу деталь.

.... 
<processor type="Sitecore.Pipelines.GetContentEditorWarnings.CanWrite, Sitecore.Kernel"/> 
<processor type="PingWorks.Pipelines.GetContentEditorWarnings.EditorIsFromAuthorGroup, PingWorks.Pipelines.GetContentEditorWarnings" patch:source="PingWorks.Pipelines.GetContentEditorWarnings.config"> 
    <ignoredRoles hint="list:AddIgnoredRole"> 
    <role>sitecore\_UserBase</role> 
    </ignoredRoles> 
    <paths hint="list:AddPath"> 
    <path>/sitecore/system/Marketing Control Panel/Taxonomies/</path> 
    <path>/sitecore/system/Marketing Control Panel/Campaigns/</path> 
    <path>/sitecore/system/Marketing Control Panel/Engagement Plans/</path> 
    <path>/sitecore/system/Marketing Control Panel/Experience Analytics/</path> 
    <path>/sitecore/system/Marketing Control Panel/FXM/</path> 
    <path>/sitecore/system/Marketing Control Panel/Outcomes/</path> 
    <path>/sitecore/system/Marketing Control Panel/Path Analyzer/</path> 
    <path>/sitecore/system/Marketing Control Panel/Personalization/</path> 
    <path>/sitecore/system/Marketing Control Panel/Test Lab/</path> 
    <path>/sitecore/system/Marketing Control Panel/Experience Explorer/</path> 
    <path>/sitecore/system/Marketing Control Panel/Analytics Filters/</path> 
    </paths> 
</processor> 
<processor type="Sitecore.Pipelines.GetContentEditorWarnings.CanWriteWorkflow, Sitecore.Kernel"/> 
... 

Обратите внимание, как вы можете использовать Factory Configuration Sitecore для заполнения свойства экземпляра, что исполнитель трубопровода будет создавать с использованием вложенных элементов, и как в этом случае мы добавляем строки в List<string> имущество путем методы ::AddIgnoredRole() и ::AddPath().

В нашем конкретном случае мы хотели разрешить редактирование только там, где редактор был членом той же группы ролей, что и исходный автор, хотя ваша логика будет еще более прямолинейной, чем наша. В нашем случае мы также добавили переопределение для пользователей-администраторов и добавили пользовательский кеш для хранения результатов поиска ролей, чтобы ускорить обработку, поскольку членство в ролях в нашем случае не меняется очень часто.

Я избавлю вас большую часть обработки, но суть его в методе ::Process() (я должен был отразить этот код, я не могу получить доступ к источнику в настоящее время):

public void Process(GetContentEditorWarningsArgs args) 
{ 
    string displayName; 
    this._item = args.Item; 
    if (!this._isValidForProcessing()) 
     return; 

    User user = null; 
    List<string> creatorRoles = this._getRolesForUser(this._item.Statistics.CreatedBy, out user); 
    List<string> editorRoles = this._getRolesForUser(Context.User); 

    // compare creator's roles with current editor to find a match 
    if (creatorRoles.Any() && editorRoles.Any() && editorRoles.Any(r => creatorRoles.Contains(r))) 
     return; 

    // if we haven't already aborted, add a warning to display and block editing 
    GetContentEditorWarningsArgs.ContentEditorWarning cew = args.Add(); 
    cew.IsExclusive = true; 
    cew.Key = "EditorIsFromAuthorGroup"; 
    cew.Title = "Editing restricted"; 
    cew.Text = $"Editing for this item is restricted. Editors must share a role with the original author, in this case <{user?.DisplayName ?? "Unknown Author"}>."; 
} 

private bool _isValidForProcessing() 
{ 
    if (this._item == null) 
     return false; 

    if (Context.IsAdministrator) 
     return false; 

    if (!this._paths.Any<string>((string p) => this._item.Paths.FullPath.ToLower().StartsWith(p))) 
     return false; 

    return true; 
} 

Это, вероятно, достаточно, чтобы вы могли начать с того, где вам нужно.

+0

Спасибо за ссылку, я посмотрю, похоже, действительно подходящее решение! –

0

Чтобы просто вещи, можно использовать замок и редактировать особенности Sitecore. Пользователь может заблокировать с помощью функции «Обзор»> «Редактировать в рабочей группе». После редактирования сделайте сохранение и нажмите кнопку регистрации. Если вошедший в систему пользователь хочет увидеть свои заблокированные элементы, тогда пользователь может щелкнуть правой кнопкой мыши по левой части дерева контента и выбрать «Мои заблокированные элементы», чтобы увидеть мой заблокированный предметный желобок. Даже вы можете просмотреть все заблокированные элементы в разделе «Обзор»> «Мои элементы». Обратите внимание, что это не вносит никаких изменений в права доступа. Но запретить другим пользователям, кроме admin, разблокировать элементы.

+0

Спасибо gupta. Тем не менее пользователи по-прежнему будут видеть элементы, в которых нет владельца. –

Смежные вопросы