Sharepoint:检查用户是否是组的成员

17

如何检查某个用户(非当前登录用户)是否是特定组的成员?尝试从不是成员的组中检索用户会导致SPException异常,因此无法检查null。

那么你会如何解决这个问题呢?目前我考虑在SPGroup.Users.XML字符串中搜索用户的名称或迭代所有组成员并检查登录名称。

更新: 我忘了提到我想避免使用异常处理来检查用户的成员资格。

6个回答

19

创建一个 SPUser的扩展类和静态方法

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

然后在您的SPUser对象上调用此方法:

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

6

我通过编写一个使用LINQ的扩展方法来实现这一点。SPGroup从SPPrincipal继承,因此您应该能够将其传递到principal参数中:

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);
}

感谢您的解决方案。虽然我不确定您所说的“SPrac”是什么意思,但我编写了一个扩展方法,用于检查SPGroup类的SPGroup.Users.Xml属性中是否包含用户登录信息。 - Flo
抱歉,查找和替换出了些问题。现在已经修复了。 - Alex Angas

4
有几种方法。SharePoint组有一个选项,可以允许仅群组所有者查看成员详细信息,或允许每个人查看成员详细信息。如果允许每个人,则不会出现安全限制,否则您需要使用RunWithElevatedPrivileges,并确保获取SPSite和SPWeb的新实例在其中使用。
话虽如此,以下是选项:
private Boolean isUserInGroup(SPGroup oGroupToTestFor,String sUserLoginName)
    {   
        Boolean bUserIsInGroup = false;
        try
        {
            SPUser x = oGroupToTestFor.Users[sUserLoginName];
            bUserIsInGroup = true;
        }
        catch (SPException)
        {
            bUserIsInGroup = false;
        }
        return bUserIsInGroup;

    }

另一种方法是:
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
请注意,除非用户浏览了该网站,否则AllUsers集合可能不包含该成员。 - Alex Nolasco
为什么不直接使用oUser.ID,而要使用UserToken呢? - Chaulky

1

你尝试过使用RunWithElevatedPrivileges吗?

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

不,这并没有改变任何事情。索引器仍然会抛出异常。 - Flo
3
这应该是一条评论而不是回答......您用另一个问题来“回答”了。 - Anthony Graglia

0

我已经实现了一种简单的方法来检查特定用户是否存在于特定的SharePoint组中。使用SPUser对象上的简单linq语句。

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

SharePoint核心解决方案上找到详细帖子。


0
为了让SPSecurity.RunWith..正常工作,您需要拥有SPSite和/或SPWeb对象的新实例,并且不使用上下文,否则它将无法正常工作。
您是否拥有要使用的SPUser对象?如果是这样,您可以直接使用SPUser.Groups集合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接