¿Como saber los permisos de un usuario para un SPListItem?

abril 14, 2010
By

En estos últimos días he estado haciendo algunas interfaces para mostrar elementos de una lista de forma jerárquica. Normalmente las vistas que SharePoint brinda por defecto no nos permiten hacer esto. Cuando uno implementa una vista diferente para una  lista de SharePoint , tiene que cargar con varias responsabilidades. Una de estas responsabilidades es la de mostrar por cada elemento los menus contextuales (como ver, editar  y eliminar), que corresponden con los permisos que tiene el usuario en este elemento.

Estuve buscando en Google, como,  dado un usuario y un SPListItem , podía saber si este tenía los mencionados permisos(ver,editar y eliminar). Las referencias apuntaron hacia el método SPListItem.DoesUserHavePermissions  . Por desgracia para mi no me fue suficiente lo que encontré  porque parecía que este método funcionaba  cuando se invocaba con un usuario que tienía permiso  Full Control en el sitio. Tuve además tuve otro problema, cuando hacía filtros para recuperar solo las columnas de los elementos que me interesaban(supongamos ID y Title), me daba  el típico error “Value does not fall within the expected range”. En ese momento me di cuenta que para calcular los permisos SharePoint necesitaba algo mas, como saberlo? !!! REFLECTOR !!!.

La conclusión:

1- Para invocar el método SPListItem.DoesUserHavePermissions(SPUser user,SPBasePermissions perm ) se necesita que el usuario que lo ejecuta tenga el permiso SPBasePermissions.EnumeratePermissions

2- Si se aplica un filtro sobre la lista se debe incluir dentro de las columnas de la vista : “PermMask“.

He aquí el fragmento de código que ejemplifica lo anterior

SPWeb web = SPContext.Current.Web;
var v = new List<Dictionary<string, object>>();
SPSecurity.RunWithElevatedPrivileges(() =>
{
using (SPSite site = new SPSite (web.Url))
{
using (SPWeb interWeb = site.OpenWeb())
{
SPList activitylist = interWeb.Lists[ListName];
int userId = SelectParams.UserId;
SPUser user = interWeb.Users.GetByID(userId);

SPQuery query = new SPQuery ();
query.ViewFields = Utility.GetViewFields(new[] { “PermMask“, “Title“, “ID” });
var listItems = activitylist.GetItems(query);

IEnumerable<SPListItem> items = listItems.Cast<SPListItem>();

foreach (var x in items)
{
v.Add(new Dictionary<string, object> {
{ “ID“, x.ID },
{ “Title” , x.Title },
{ “perm_Delete“,x.DoesUserHavePermissions(user,SPBasePermissions.DeleteListItems)},
{ “perm_Edit“,x.DoesUserHavePermissions(user,SPBasePermissions.EditListItems)}
});
}

}
}
});
return v;

He de señalar que una forma de asegurar que nuestro código tenga el permiso SPBasePermissions.EnumeratePermissions es ejecutándolo dentro del método SPSecurity.RunWithElevatedPrivileges.

Tags: ,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Acerca del autor...

Raimil Cruz

Raimil Cruz
Graduado en Ciencia de la Computación en la Universidad de la Habana. Imparte docencia en la asignatura de Programación en la Facultad de Matemática y Computación. Miembro del Grupo Weboo (Web ...Leer completo