Sharepoint: проверьте, является ли пользователь членом группы.
как я могу проверить, является ли пользователь (а не тот, кто в настоящий момент входит в систему) является членом определенной группы? Попытка извлечь пользователя из группы, членом которой он не является, приводит к исключению SPException, поэтому проверка на null невозможна.
Итак, как бы вы решили эту проблему. В настоящий момент я думаю о поиске в строке SPGroup.Users.XML для имени пользователя или итерации по всем членам группы и проверке имен входа.
Update:
Я забыл упомянуть, что хочу избежать использования обработки исключений, чтобы проверить членство пользователя.
Ответы
Ответ 1
Я сделал это, написав метод расширения, используя 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
Создайте Класс расширения для 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);
Ответ 3
Несколько способов. Группа 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;
}
Ответ 4
Вы пытались использовать RunWithElevatedPrivileges?
SPSecurity.RunWithElevatedPrivileges(delegate()
{
//put your code here to get the group and test for the user
});
Ответ 5
Чтобы сделать работу SPSecurity.RunWith.., вам нужно иметь новый экземпляр объекта SPSite и/или SPWeb, а не использовать контекст, иначе он не будет работать.
У вас есть объект SPUser для использования? Если это так, вы можете просто использовать коллекцию SPUser.Groups.
Ответ 6
Я применил простой способ проверить, существует ли конкретный пользователь в определенной группе SharePoint. Простой оператор с linq на объекте SPUser.
bool userExsists = spUser.Groups.Cast<SPGroup>().Any(g => g.Name.ToLower() == spGroup.Name.ToLower());
Найти подробное сообщение на Основные решения SharePoint.