Inicio > C#, Cómo hacer, Microsoft Office SharePoint Server, SharePoint, Windows SharePoint Services > Cómo identificar si un usuario de SharePoint pertenece a un grupo

Cómo identificar si un usuario de SharePoint pertenece a un grupo


Habrá ocasiones en las que querremos realizar determinada acción sólo si un usuario pertenece a cierto grupo. Por ejemplo, mostrar controles, permitir ediciones, regular la seguridad, etc. En esta entrada veremos como solucionar este problema.

Existen dos formas de enfocar el problema: a) podemos obtener el grupo en cuestión y ver si el usuario en cuestión pertenece a él, o bien b) obtenemos el usuario y revisamos todos sus grupos, hasta encontrar el que buscamos. Exploraremos las dos opciones.

En SharePoint, la clase SPUser identifica a un usuario, mientras que la clase SPGroup identifica a un grupo. Un usuario cualquiera cuenta con una propiedad llamada Groups, de tipo SPGroupCollection, la cual contiene una referencia a los grupos del usuario. Adicionalmente, un grupo cuenta con una propiedad llamada Users, de tipo SPUserCollection, la cual contiene todos los usuarios pertenecientes al grupo. Así, vemos que para resolver nuestro problema con cualquiera de los dos enfoques, sólo tenemos que iterar sobre un SPUserCollection o SPGroupCollection, según sea el caso. Tristemente, no exsite un método llamado “ContainsGroup” o “ContainsUser” para estas colecciones, así que tendremos que iterar. Nos podemos apoyar en LINQ, sin embargo.

Vamos a hacer un ejemplo. En nuestro sitio, creemos un par de grupos y añadámosle algunos usuarios. En mi sitio, yo he creado el grupo “Asgard Æsir”, al cual pertenecen los usuarios ASGARD\odin, ASGARD\thor y ASGARD\tyr; y el sitio “Asgard Vanir”, al cual pertenecen los usuarios ASGARD\freyja, ASGARD\skadi y ASGARD\loki. La siguiente imagen lo ilustra.

image

Ahora, creemos un simple WebPart y añadámosle dos métodos: MatchByGroup, el cual tome como parámetros el nombre de algún grupo y escriba si un usuario cualquiera pertenece a éste o no; y MatchByUser, el cual tome como parámetro el nombre de algún usuario y escriba si pertenece a un grupo cualquiera.

El siguiente es el código de MatchByGroup.

private void MatchByGroup(HtmlTextWriter writer, string groupName, string userLogin)
{
    SPGroup spgroup = SPContext.Current.Web.SiteGroups[groupName];
    var query = from SPUser user in spgroup.Users
                where user.LoginName.Equals(userLogin)
                select user;
    bool match = query.Count() > 0;

    writer.Write("El grupo '{0}' contiene al usuario '{1}': {2}<br/>", 
        spgroup.Name, userLogin, match);
}

Como podemos ver, primero obtenemos el grupo y hacemos una consulta LINQ a la propuedad SPGroup.Users en busca de aquellos usuarios cuyo LoginName concuerde. Si la consulta nos devuelve más de un elemento, entonces sí lo hace.

Así, el algoritmo para el método MatchByUser es muy similar, solo que hacemos la consulta LINQ sobre SPUser.Groups. Aquí está el código.

private void MatchByUser(HtmlTextWriter writer, string groupName, string userLogin)
{
    SPUser user = SPContext.Current.Web.AllUsers[userLogin];
    var query = from SPGroup spgroup in user.Groups
                where spgroup.Name.Equals(groupName)
                select spgroup;
    bool match = query.Count() > 0;

    writer.Write("El usuario '{0}' pertenece al grupo '{1}': {2}<br/>",
        user.LoginName, groupName, match);
}

Easy peasy. En nuestro WebPart, solo falta sobreescribir el método RenderContents e invocar a nuestros métodos. Por ejemplo:

protected override void RenderContents(HtmlTextWriter writer)
{
    base.RenderContents(writer);

    writer.Write("<h2>Por grupo</h2>");
    MatchByGroup(writer, "Asgard Vanir", "ASGARD\\thor");
    MatchByGroup(writer, "Asgard Vanir", "ASGARD\\freyja");
    MatchByGroup(writer, "Asgard Vanir", "ASGARD\\loki");
    writer.Write("<h2>Por usuario</h2>");
    MatchByUser(writer, "Asgard Vanir", "ASGARD\\thor");
    MatchByUser(writer, "Asgard Vanir", "ASGARD\\freyja");
    MatchByUser(writer, "Asgard Vanir", "ASGARD\\loki");
}

Con este código, así es como luce nuestro WebPart.

image

Y ya por último, para los flojos que gustan de hacer copy-paste, les dejo el código completo del WebPart.

using System;
using System.Linq;
using System.Web.UI;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebPartPages;

namespace Fermasmas.Wordpress.Com.WebParts
{
    public class UserGroupExample : WebPart
    {
        public UserGroupExample()
        {
        }

        private void MatchByGroup(HtmlTextWriter writer, string groupName, string userLogin)
        {
            SPGroup spgroup = SPContext.Current.Web.SiteGroups[groupName];
            var query = from SPUser user in spgroup.Users
                        where user.LoginName.Equals(userLogin)
                        select user;
            bool match = query.Count() > 0;

            writer.Write("El grupo '{0}' contiene al usuario '{1}': {2}<br/>",
                spgroup.Name, userLogin, match);
        }

        private void MatchByUser(HtmlTextWriter writer, string groupName, string userLogin)
        {
            SPUser user = SPContext.Current.Web.AllUsers[userLogin];
            var query = from SPGroup spgroup in user.Groups
                        where spgroup.Name.Equals(groupName)
                        select spgroup;
            bool match = query.Count() > 0;

            writer.Write("El usuario '{0}' pertenece al grupo '{1}': {2}<br/>",
                user.LoginName, groupName, match);
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            base.RenderContents(writer);

            writer.Write("<h2>Por grupo</h2>");
            MatchByGroup(writer, "Asgard Vanir", "ASGARD\\thor");
            MatchByGroup(writer, "Asgard Vanir", "ASGARD\\freyja");
            MatchByGroup(writer, "Asgard Vanir", "ASGARD\\loki");
            writer.Write("<h2>Por usuario</h2>");
            MatchByUser(writer, "Asgard Vanir", "ASGARD\\thor");
            MatchByUser(writer, "Asgard Vanir", "ASGARD\\freyja");
            MatchByUser(writer, "Asgard Vanir", "ASGARD\\loki");
        }
    }
}

Buen fin de semana.

  1. julio 21, 2011 a las 12:03 pm

    Para ver cómo identificar si el usuario autenticado pertenece a un grupo, revisa este post:
    https://fermasmas.wordpress.com/2011/04/18/cmo-identificar-si-el-usuario-autenticado-pertenece-a-un-grupo-de-sharepoint/

    Para determinar si un usuario pertenece a alguno de los grupos estándares de SharePoint (dueños del sitio, miembros o visitantes) revisa este post:
    https://fermasmas.wordpress.com/2011/07/21/determinar-si-un-usuario-es-dueo-miembro-o-visitante-del-sitio/

  1. abril 18, 2011 a las 5:31 pm
  2. julio 21, 2011 a las 11:51 am

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s