none
Обработчик событий для автоматической смены прав в документе RRS feed

  • Вопрос

  • Доброго времени суток! Обработчик должен сменять права на документ автоматически после его создания или изменения пользователем. Но должен записать в разрешения документа не текущего пользователя, а группу в которую он входит. Код обработчика в visual studio 2010 ошибок не выдает, но и не работает. Помогите пожалуйста с кодом, если кто может подправить его. Заранее благодарен.

    Вот сам код обработчика событий:

    using System;
    using System.Security.Permissions;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Security;
    using Microsoft.SharePoint.Utilities;
    using Microsoft.SharePoint.Workflow;

    namespace EventReceiverProject7.EventReceiver1
    {
        /// <summary>
        /// События элемента списка
        /// </summary>
        public class EventReceiver1 : SPItemEventReceiver
        {
           /// <summary>
           /// Добавлен элемент.
           /// </summary>
           public override void ItemAdded(SPItemEventProperties properties)
           {
               base.ItemAdded(properties);

           }

            
           /// <summary>
           /// Обновлен элемент.
           /// </summary>
           public override void ItemUpdated(SPItemEventProperties properties)
           {
               base.ItemUpdated(properties);

           }

           public bool IsUserAuthorized(string groupName, SPItemEventProperties properties)
           {
               IsUserAuthorized("currentUser", properties);
               {

                   //Retreiving the current context
                   SPSite site = SPContext.Current.Site;

                   //Opening a current web and creating a instance
                   using (SPWeb web = site.OpenWeb())
                   {
                       //Retreiving the current logged in user
                       SPUser currentUser = web.CurrentUser;

                       //Retrieving all the user groups in the site/web
                       SPGroupCollection userGroups = currentUser.Groups;

                       //Loops through the grops and check if the user is part of given group or not.
                       foreach (SPGroup group in userGroups)
                       {
                           //Checking the group
                           if (group.Name.Contains(groupName))
                               return true;                       
                       }
                       
                       properties.ListItem["Created By"] = currentUser;
                       properties.ListItem["Modified By"] = currentUser;
                       properties.ListItem.SystemUpdate(false);
                       SetSPListItemUserPermissions(properties.ListItem, currentUser, SPRoleType.Contributor);
                   }
                   return false;
               }
           }

           public void SetSPListItemUserPermissions(SPListItem listItem, SPPrincipal Principal, SPRoleType roleType)
           {

               //Break role inheritance
               if (!listItem.HasUniqueRoleAssignments)
                   listItem.BreakRoleInheritance(false);
               listItem.Update();

               //Create new role
               var roleDefinition = listItem.Web.RoleDefinitions.GetByType(roleType);
               var roleAssignment = new SPRoleAssignment(Principal);
               roleAssignment.RoleDefinitionBindings.Add(roleDefinition);

               //Assign new role
               listItem.RoleAssignments.Add(roleAssignment);
               listItem.Update();
           }
        }
    }

    31 октября 2012 г. 7:24

Ответы

Все ответы

  • Добрый день

    Несколько моментов которые заметил при беглом просмотре:

    1) метод SetSPListItemUserPermissions у вас используется только в IsUserAuthorized, который в свою очередь не вызывается нигде, должен вызываться в  ItemAdded, Updated

    2) после BrakRoleInheritance и RoleAssignments.Add не нужно вызывать listItem.Update.

    3) не понятна строчка IsUserAuthorized("currentUser", properties); в методе IsUserAuthorized(string groupName, SPItemEventProperties properties)... Рекурсия вечная ?

    4) SPContext.Current у вас будет NULL всегда (теоретически можно сделать ресивер чтобы там был сп контекст - но он должен быть синхронным), проще вам полчуать все необходимое из объекта SPItemEventProperties

    5) У пользователя под которым выполняется зазначение прав, енумерация групп теоретически может не быть прав на проведение этих действий - потому рекомендую либо использовать RunWithElevatedPriveleges или создавать SPSite с токеном системной учетки шарика и уже после этого получать новые объекты SPList, SPListItem

    6) Установите SharePoint Manager чтобы убедиться что ресивер действительно приаттачен к списку\типу содержимого


    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    • Предложено в качестве ответа HeToC 31 октября 2012 г. 13:19
    31 октября 2012 г. 7:42
  • А не могли бы Вы подправить мне код? Просто я только изучаю C# и еще очень мало знаю :) А вот этот метод  public bool IsUserAuthorized(string groupName, SPItemEventProperties properties) разве не надо переписать вот так public void SetSPListItemUserPermissions(SPListItem listItem, SPPrincipal Principal, SPRoleType roleType), что бы возвращал не true и false?
    31 октября 2012 г. 8:55
  • Спасибо за ответ. Я уже переписал код и все работает как я хотел :)
    • Помечено в качестве ответа Ruslan P 31 октября 2012 г. 12:14
    31 октября 2012 г. 12:14