17

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

那么你将如何解决这个问题。目前,我考虑在 SPGroup.Users.XML 字符串中搜索用户名或遍历所有组成员并检查登录名。

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

4

6 回答 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);
于 2011-12-01T15:39:14.510 回答
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);
}
于 2009-07-01T09:00:54.707 回答
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;

    }
于 2009-06-30T16:00:18.620 回答
1

您是否尝试过使用RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges(delegate()
        {
             //put your code here to get the group and test for the user
        });
于 2009-06-30T14:35:16.863 回答
0

为了使 SPSecurity.RunWith.. 工作,您需要有一个 SPSite 和/或 SPWeb 对象的新实例,并且不使用上下文,否则它将无法工作。

你有 SPUser 对象要使用吗?如果是这样,您可以只使用 SPUser.Groups 集合。

于 2009-07-01T05:50:26.860 回答
0

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

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

查找有关SharePoint 核心解决方案的详细帖子。

于 2013-12-17T09:28:59.100 回答