IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ Sharepoint

logo
Sommaire > Outils et développement > Sécurité Dynamique
        Comment lister les utilisateurs faisant partie d'un groupe?
        Comment ajouter un groupe dynamiquement dans la sécurité d'un site?
        Comment ajouter un utilisateur dans un groupe?
        Comment attribuer un rôle (permission level) à un utilisateur?
        Comment attribuer un rôle (permission level) à un groupe?
        Comment supprimer un utilisateur d'un groupe?
        Comment supprimer un groupe?
        Comment associer un groupe ou un utilisateur dans la sécurité d'un élément de liste dynamiquement?
        Comment casser l'héritage automatique en utilisant des permissions uniques?
        Comment exécuter une portion de code avec une autre identité?
        Comment n'obtenir que la liste que l'utilisateur courant peut accéder?
        Comment savoir si l'utilisateur courant peut lire, écrire dans une liste?



Comment lister les utilisateurs faisant partie d'un groupe?
auteur : Stephane Eyskens

try
{
   using(SPSite TargetSite = new SPSite("url du site"))
   {
      using(SPWeb TargetWeb = TargetSite.OpenWeb())
      {
        foreach (SPUser User in TargetWeb.Groups["Le Groupe"].Users)
        {
           Console.WriteLine(User.Name);
        }
      }
   }
}
catch(Exception Ex)
{
 //traitement d'erreur
}      
Notez que lorsqu'il est possible d'éviter un foreach, c'est préférable. Vous auriez donc pu utiliser cette boucle

for(int i=0;i<TargetWeb.Groups["Default Visitors"].Users.Count;i++)
{
   SPUser User = TargetWeb.Groups["Default Visitors"].Users[i] as SPUser;
   Console.WriteLine(User.Name);
}

Comment ajouter un groupe dynamiquement dans la sécurité d'un site?
auteur : Stephane Eyskens

try
{
   using(SPSite TargetSite = new SPSite("url du site"))
   {
      using(SPWeb TargetWeb = TargetSite.OpenWeb())
      {
        SPUser User = TargetWeb.AllUsers["LeLoginDuUser"];
        TargetWeb.SiteGroups.Add("LeNomDuGruope", User as SPMember, User, "Description");
      }
   }
}
catch(Exception Ex)
{
 //traitement d'erreur
}      

Comment ajouter un utilisateur dans un groupe?
auteur : Stephane Eyskens

try
{
   using(SPSite TargetSite = new SPSite("url du site"))
   {
      using(SPWeb TargetWeb = TargetSite.OpenWeb())
      {
        TargetWeb.SiteGroups["LeGroupe"].Users.Add("login", "email", "Nom", "");
      }
   }
}
catch(Exception Ex)
{
 //traitement d'erreur
}      

Comment attribuer un rôle (permission level) à un utilisateur?
auteur : Stephane Eyskens

try
{
   using(SPSite TargetSite = new SPSite("url du site"))
   {
      using(SPWeb TargetWeb = TargetSite.OpenWeb())
      {
			SPRoleAssignment NewRole = new SPRoleAssignment("Login","Email","Nom","Notes");                       
            NewRole.RoleDefinitionBindings.Add(TargetWeb.RoleDefinitions["Read"]);
            TargetWeb.RoleAssignments.Add(NewRole);
      }
   }
}
catch(Exception Ex)
{
 //traitement d'erreur
}      

Comment attribuer un rôle (permission level) à un groupe?
auteur : Stephane Eyskens

try
{
   using(SPSite TargetSite = new SPSite("url du site"))
   {
      using(SPWeb TargetWeb = TargetSite.OpenWeb())
      {
			SPPrincipal TargetGroup = TargetWeb.SiteGroups["Le Groupe"];                        
            SPRoleAssignment NewRole = new SPRoleAssignment(TargetGroup);
            NewRole.RoleDefinitionBindings.Add(TargetWeb.RoleDefinitions["Read"]);
            TargetWeb.RoleAssignments.Add(NewRole);
      }
   }
}
catch(Exception Ex)
{
 //traitement d'erreur
}      

Comment supprimer un utilisateur d'un groupe?
auteur : Stephane Eyskens

try
{
   using(SPSite TargetSite = new SPSite("url du site"))
   {
      using(SPWeb TargetWeb = TargetSite.OpenWeb())
      {
           TargetWeb.SiteGroups["Le Groupe"].RemoveUser(
                            TargetWeb.SiteGroups["Le Groupe"].Users["Login"]);
      }
   }
}
catch(Exception Ex)
{
 //traitement d'erreur
}      

Comment supprimer un groupe?
auteur : Stephane Eyskens

try
{
   using(SPSite TargetSite = new SPSite("url du site"))
   {
      using(SPWeb TargetWeb = TargetSite.OpenWeb())
      {
           TargetWeb.SiteGroups.Remove("Nom Groupe");
      }
   }
}
catch(Exception Ex)
{
 //traitement d'erreur
}      

Comment associer un groupe ou un utilisateur dans la sécurité d'un élément de liste dynamiquement?
auteur : Stephane Eyskens

try
{
   using(SPSite TargetSite = new SPSite("url du site"))
   {
      using(SPWeb TargetWeb = TargetSite.OpenWeb())
      {
			SPRoleAssignment NewAssignment = null;

            //Cet exemple montre comment casser l'héritage sur un
            //élément de liste afin d'y ajouter uniquement un utilisateur
            //et un groupe comme lecteurs.
            
            SPListItem Item = TargetWeb.Lists["La Liste"].GetItemById(ID);
            Item.BreakRoleInheritance(false);               
            NewAssignment = new SPRoleAssignment("SEY-PC\\Toto", "toto@toto.com", "Toto", "");
            NewAssignment.RoleDefinitionBindings.Add(TargetWeb.RoleDefinitions["Read"]);
            Item.RoleAssignments.Add(NewAssignment);
            //Ajout du groupe à présent
            SPPrincipal Group = TargetWeb.SiteGroups["TestGroup"];
            NewAssignment = new SPRoleAssignment(Group);
            NewAssignment.RoleDefinitionBindings.Add(TargetWeb.RoleDefinitions["Read"]);
            Item.RoleAssignments.Add(NewAssignment);                  
            Item.Update();
      }
   }
}
catch(Exception Ex)
{
 //traitement d'erreur
}      

Comment casser l'héritage automatique en utilisant des permissions uniques?
auteur : Stephane Eyskens
Comme vous le savez déjà, l'héritage automatique est d'application lorsque vous créez un objet dans Sharepoint. La sécurité définie au niveau de l'élément conteneur est implicitement appliquée à l'élément que l'on vient de créer. Si vous devez systématiquement modifier ce comportement afin d'appliquer des permissions uniques à chaque fois qu'un élément se crée et en fonction de critères spécifiques (métadonnées), vous pouvez le faire au travers d'un event handler, ou d'un workflow qui se déclenche automatiquement.

Voici un exemple montrant comment casser l'héritage

ElementAuquelOnAppliqueDesPermissionsUniques.BreakRoleInheritance(false);
//ou
ElementAuquelOnAppliqueDesPermissionsUniques.BreakRoleInheritance(true);
//false => ne copie pas les permissions existantes, true si

Comment exécuter une portion de code avec une autre identité?
auteur : Stephane Eyskens
Habituellement, si du code s'exécute au sein d'un workflow ou d'un event handler, c'est sous l'identité du visiteur qui a déclenché l'action, du moins en ce qui concerne les accès aux objets Sharepoint. Ce comportement est bien sûr cohérent et souhaitable. Cependant, il est parfois nécessaire de pouvoir exécuter du code quelles que soient les permissions du visiteur courant. Ceci se vérifie lorsque l'on souhaite attribuer une sécurité particulière sur un élément de liste que l'utilisateur de type "contributeur" vient de créer mais dont il n'a pas le droit de gérer la sécurité.

Donc, si dans un Event Handler on modifie les permissions de tous les éléments au moment de leur création, il faut pouvoir le faire et ce, même si l'utilisateur courant n'a pas les droits requis pour gérer les autorisations.

try
{
   SPSecurity.RunWithElevatedPrivileges(delegate()
   {
   		using(SPSite TargetSite = new SPSite("url du site"))
   		{
      		using(SPWeb TargetWeb = TargetSite.OpenWeb())
      		{
				SPRoleAssignment NewAssignment = null;            
            	SPListItem Item = TargetWeb.Lists["La Liste"].GetItemById(ID);
            	Item.BreakRoleInheritance(false);               
            	NewAssignment = new SPRoleAssignment("SEY-PC\\Toto", "toto@toto.com", "Toto", "");
            	NewAssignment.RoleDefinitionBindings.Add(TargetWeb.RoleDefinitions["Read"]);
            	Item.RoleAssignments.Add(NewAssignment);            
            	Item.Update();
      	}
   	}
   	});
}
catch(Exception Ex)
{
 //traitement d'erreur
}      
RunWithElevatedPrivileges permet d'exécuter la portion de code que l'on y encapsule dans un contexte de sécurité différent qui autorise le full control. Par contre, tous les objets que l'on y manipule doivent être créés au sein de l'encapsulation. On ne pourra pas utiliser SPContext.Current.Web avec des droits full control car il n'a pas été créé dans le délégué.


Comment n'obtenir que la liste que l'utilisateur courant peut accéder?
auteur : Stephane Eyskens
Plutôt que de passer par la méthode "AllWebs" qui tente de retourner une collection de TOUS les sous-sites du site courant, il est préférable d'utiliser une autre méthode si votre code est susceptible d'être exécuté sous l'indentité d'un tiers. En effet AllWebs retournera une erreur de type Access Denied/Accès Refusé si l'utilisateur courant n'a pas accès à l'un des sous-sites.

try
{
   using(SPSite TargetSite = new SPSite("url du site"))
   {
      using(SPWeb TargetWeb = TargetSite.OpenWeb())
      {
			SPWebCollection SubSites = TargetWeb.GetSubwebsForCurrentUser();
            for (int i = 0; i < SubSites.Count; i++)
            {
               SPWeb CurrentSubWeb = SubSites[i] as SPWeb;
               if (CurrentSubWeb != null)
               {
                   Console.WriteLine(CurrentSubWeb.Name);
               }
            }
      }
   }
}
catch(Exception Ex)
{
 //traitement d'erreur
}      
Vous l'aurez compris, GetSubwebsForCurrentUser() évite toute erreur d'accès quel que soit l'utilisateur connecté


Comment savoir si l'utilisateur courant peut lire, écrire dans une liste?
auteur : Stephane Eyskens
Imaginons qu'on soit dans le contexte d'un webpart, on pourrait tester si l'utilisateur courant a le droit d'écrire dans une liste de cette manière:

try
{
	//On dit à Sharepoint de ne pas rediriger automatiquement vers la page "Accès Refusé"
	SPContext.Current.Site.CatchAccessDeniedException = false;
	//On reçoit une liste en lui passant son URL
	SPList TargetList = SPContext.Current.Web.GetList("/Lists/laliste");
	//On vérifie si l'utilisateur peut ajouter des éléments
	if (TargetList.DoesUserHavePermissions(SPBasePermissions.AddListItems))
	{
		//Il peut écrire
	}
	else
	{
		//Il ne peut pas
	}
}
//Cette exception est lancée si l'utilisateur ne peut pas du tout accéder à la liste.
catch (UnauthorizedAccessException)
{
	//Il n'a pas accès à la liste                
}
SPBasePermissions permet de tester tous les types de permissions.



Consultez les autres F.A.Q's


Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2007 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.