2009-06-30 28 views
15

¿cómo puedo comprobar si un usuario (no el que está actualmente conectado) pertenece a un determinado grupo? Intentar recuperar a un usuario de un grupo del que no es miembro conduce a una excepción SPEx, por lo que no es posible verificar el valor nulo.Sharepoint: compruebe si un usuario es miembro de un grupo

Entonces, ¿cómo resolvería este problema. Por el momento, pienso en buscar en la cadena SPGroup.Users.XML el nombre del usuario o iterar sobre todos los miembros del grupo y verificar los nombres de inicio de sesión.

Actualización: Olvidé mencionar que quiero evitar el uso del manejo de excepciones para verificar la membresía del usuario.

Respuesta

6

He hecho esto escribiendo un método de extensión usando LINQ. SPGROUP hereda de SPPrincipal por lo que debe ser capaz de pasar a través de la principal parámetro:

public static bool Contains(this SPRoleAssignmentCollection rac, SPPrincipal principal) 
{ 
    XElement racXml = XElement.Parse(rac.Xml); 
    return racXml.Elements("permission").Any(vw => (int)vw.Attribute("memberid") == principal.ID); 
} 
+0

Gracias por su solución. Aunque no estaba seguro de lo que quiere decir con "SPrac", entonces escribí un método de extensión para la clase SPGroup que verifica la propiedad SPGroup.Users.Xml para el inicio de sesión de un usuario. – Flo

+0

Lo siento, encontrar y reemplazar salió mal. Corregido ahora. –

1

¿Ha intentado utilizar RunWithElevatedPrivileges?

SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      //put your code here to get the group and test for the user 
     }); 
+0

No, eso no cambia nada. El indexador todavía arroja una excepción. – Flo

+3

Esto debería ser un comentario y no una respuesta ... 'respondiste' con otra pregunta. – trgraglia

4

Par de maneras. El grupo de SharePoint tiene una Opción que solo permite que el Propietario del grupo vea los detalles de la membresía o permite que todos puedan ver los detalles de la membresía. Si se permite a cada uno, no obtendrá la restricción de seguridad, de lo contrario deberá ejecutar RunWithElevatedPrivileges, y asegúrese de obtener una nueva instancia de SPSite & SPWeb para usar dentro de eso.

Ser dijo que a continuación son las opciones:

private Boolean isUserInGroup(SPGroup oGroupToTestFor,String sUserLoginName) 
    { 
     Boolean bUserIsInGroup = false; 
     try 
     { 
      SPUser x = oGroupToTestFor.Users[sUserLoginName]; 
      bUserIsInGroup = true; 
     } 
     catch (SPException) 
     { 
      bUserIsInGroup = false; 
     } 
     return bUserIsInGroup; 

    } 

Otra forma es a

private Boolean isUserInGroup(SPGroup oGroupToTestFor, String sUserLoginName) 
    { 
     Boolean bUserIsInGroup = false; 

      SPUser oUser =null; 
      try{ 
       oUser = SPContext.Current.Web.AllUsers[sUserLoginName]; 
       } 
      catch{} 
      if(oUser!=null){ 
      foreach (SPUser item in oGroupToTestFor.Users) 
      { 
       if (item.UserToken == oUser.UserToken) 
       { 
        bUserIsInGroup = true; 
        break; 
       }      
      } 
      } 

     return bUserIsInGroup; 

    } 
+2

Tenga en cuenta que la colección AllUsers no puede contener el miembro a menos que el usuario haya navegado por el sitio. –

+0

¿Por qué no usar simplemente el oUser.ID en lugar de UserToken? – Chaulky

0

Con el fin de hacer que el SPSecurity.RunWith .. trabajo, es necesario tener una nueva instancia de el objeto SPSite y/o SPWeb y no usa el contexto; de lo contrario, no funcionará.

¿Tiene el objeto SPUser para usar? De ser así, solo puede usar la colección SPUser.Groups.

17

Crear Extension class for SPUser and static method:

public static class SPUserExtension { 
    public static bool InGroup(this SPUser user, SPGroup group) 
     { 
     return user.Groups.Cast<SPGroup>() 
      .Any(g => g.ID == group.ID); 
     } 
    } 
} 

luego llamar a este método en el objeto SPUser:

SPUser user; 
SPGroup group; 
//... 
bool isMember = user.InGroup(group); 
0

Implementé una forma simple de verificar si existe un usuario específico en un grupo específico de SharePoint. Una declaración simple con linq en el objeto SPUser.

bool userExsists = spUser.Groups.Cast<SPGroup>().Any(g => g.Name.ToLower() == spGroup.Name.ToLower()); 

Encuentra la publicación detallada en SharePoint Core Solutions.

Cuestiones relacionadas