Event Handler de modification des autorisations sur les tâches d’un workflow SharePoint


Cet article fait partie d’une série concernant la mise en oeuvre de liste externes et de workflows avec SharePoint. Les étapes suivantes seront passées en revue :

_______________________________________________________________________________________________

Lorsqu’une tâche est créée automatiquement par une activité de workflow, elle l’est dans la liste de tâche associée au Workflow en cours. Cette liste de tâche hérite bien souvent des autorisations de son site, qui lui-même pourrait hérité des autorisation de son site parent.

Dû à cette gestion des autorisations, il s’avère, que si je me rend directement dans la liste de tâches du workflow, je peux voir les tâches affectées aux autres acteurs du Workflow, ce qui n’est pas toujours souhaité. Ceci peut ne poser aucun problème puisqu’une des nouveautés de SharePoint 2013 permet d’agréger l’ensemble des tâches affectées à un utilisateur dans son site personnel, et ceci de manière transverse (cross collection de site) grâce à l’application de Service de « Gestion du travail » (ou « Work Management »).

L’utilisateur ne verra donc que ses propres tâches triées dynamiquement en fonction de leur sources. il pourra également gérer sa « to-do list ». Il a également la possibilité de filtrer ses tâches en fonction de leur statut et de leur date d’échéance. Plutôt sympathique.

Une très bonne explication de tout cela sur le post Work Management Application de Mickey75019.

mes tâches sharepoint 2013

Ici on ne parle que d’affichage mais pas de gestion de la sécurité liée à ces tâches. Si on veut empêcher un utilisateur de consulter/modifier toutes les tâches car il a des droits de lecture/ édition sur la liste de tâche, ou qu’il est lui même acteur du Workflow mais qu’il ne doit pas voir les tâches de tous les autres acteurs, alors il faut systématiquement réécrire les autorisations des tâches créées par le Workflow via un Event Handler (=récepteur d’événement = trigger).

Ci dessous le code C# permettant de répondre à ce besoin. J’y vais surement un peu fort sur le allowUnsafeUpdate et suis preneur de retours pour des optims si vous en avez … mais ça fonctionne 🙂

 public class TaskEventReceiver : SPItemEventReceiver
    {
        /// <summary>
        /// Un élément a été ajouté.
        /// </summary>
        public override void ItemAdded(SPItemEventProperties properties)
        {
            base.ItemAdded(properties);

            try
            {

                //changement d'autorisation sur chaque tâche afin que les utilisateurs ne voient que les tâches qui leur sont affectées

                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    using (SPSite site = new SPSite(properties.WebUrl))
                    {
                        site.AllowUnsafeUpdates = true;

                        using (SPWeb web = site.OpenWeb())
                        {
                            web.AllowUnsafeUpdates = true;

                            SPListItem myItem = web.Lists[properties.ListId].GetItemById(properties.ListItem.ID); //  GET LIST OBJECT FROM SPWEB, NOT EVENT PROPERTIES

                            myItem.BreakRoleInheritance(false);

                            string spgroup = myItem["AssignedTo"].ToString();
                            spgroup = spgroup.Split('#')[1];

                            SPMember member = web.SiteGroups[spgroup];
                            SPPrincipal principal = (SPPrincipal)member;
                            SPRoleDefinition roledefinition = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                            SPRoleAssignment myRoleAssignment = new SPRoleAssignment(principal);
                            myRoleAssignment.RoleDefinitionBindings.Add(roledefinition);
                            myItem.RoleAssignments.Add(myRoleAssignment);
                            myItem.Update();
                            web.AllowUnsafeUpdates = false;
                            site.AllowUnsafeUpdates = false;
                        }
                    }
                });
            }
            catch (Exception ex)
            {
                ULSLogging.LogError("{0} De la mise à jour des autorisations, message : " + ex.Message  + " StackStrace : " + ex.StackTrace, "Ereur :");
            }
        }
}
}

Ce code serveur, déployé sous forme de feature/WSP, est exécuté à chaque fois qu’une tâche est ajoutée dans la liste que je cible (association de l’event handler avec la liste dans la feature). Il récupère le groupe auquel est assigné la tâche pour lui donner les droits de contribution sur celle-ci. Il supprime toutes les autres autorisations grâce à cette méthode : myItem.BreakRoleInheritance(false);

Un nouvel outil disponible sur codeplex permet également de répondre à cette problématique. il s’appelle SharePoint Rules Permissions

Pas encore eu l’occasion de le tester mais ce cas d’usage est cité de la description. Je suis preneur de vos retours 🙂

Publicités

Une réflexion au sujet de « Event Handler de modification des autorisations sur les tâches d’un workflow SharePoint »

  1. Ping : Comment afficher les tâches affectées à un utilisateur SharePoint et à ses groupes | SharePoint 2013 - Blog technique d'Alexandre DAVID

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s