如何检查用户(不是当前登录的用户)是否是某个组的成员?尝试从他不是成员的组中检索用户会导致SPException,因此无法检查null。
那你怎么解决这个问题呢?目前,我考虑在SPGroup.Users.XML字符串中搜索用户名,或者迭代所有组成员并检查登录名。
更新 我忘了提到我想避免使用异常处理来检查用户的成员资格。
答案 0 :(得分:17)
创建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);
}
}
}
然后在SPUser对象上调用此方法:
SPUser user;
SPGroup group;
//...
bool isMember = user.InGroup(group);
答案 1 :(得分: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);
}
答案 2 :(得分:4)
几种方式。 SharePoint组具有一个选项,该选项只允许组所有者查看成员资格详细信息或允许每个人查看成员资格详细信息。如果允许每个人都不会获得安全限制,否则你需要RunWithElevatedPrivileges,并确保获得SPSite&amp;的新实例。 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;
}
答案 3 :(得分:1)
您是否尝试过使用RunWithElevatedPrivileges?
SPSecurity.RunWithElevatedPrivileges(delegate()
{
//put your code here to get the group and test for the user
});
答案 4 :(得分:0)
为了使SPSecurity.RunWith ..工作,你需要有一个SPSite和/或SPWeb对象的新实例,而不是使用上下文,否则它将无法工作。
您是否要使用SPUser对象?如果是这样,您只需使用SPUser.Groups集合。
答案 5 :(得分:0)
我已经实现了一种简单的方法来检查特定SharePoint组中是否存在特定用户。在SPUser对象上使用linq的简单语句。
bool userExsists = spUser.Groups.Cast<SPGroup>().Any(g => g.Name.ToLower() == spGroup.Name.ToLower());
在SharePoint Core Solutions上找到详细信息。