Sharepoint: проверьте, является ли пользователь членом группы

как я могу проверить, является ли пользователь (не тот, который в данный момент вошел в систему) членом определенной группы? Попытка получить пользователя из группы, членом которой он не является, приводит к исключению SPException, поэтому проверка на нуль невозможна.

Итак, как бы вы решили эту проблему. На данный момент я думаю о поиске в строке SPGroup.Users.XML имени пользователя или переборе всех членов группы и проверке имен для входа.

Обновление: я забыл упомянуть, что хочу избежать использования обработки исключений для проверки членства пользователя.


person Flo    schedule 30.06.2009    source источник


Ответы (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);
}
person Alex Angas    schedule 01.07.2009
comment
Спасибо за ваше решение. Хотя я не был уверен, что вы имеете в виду под SPrac, поэтому я написал метод расширения для класса SPGroup, который проверяет свойство SPGroup.Users.Xml для входа пользователя в систему. - person Flo; 02.07.2009
comment
Извините, найти и заменить пошло наперекосяк. Исправлено сейчас. - person Alex Angas; 02.07.2009


Пара способов. В группе 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;

    }
person Kusek    schedule 30.06.2009
comment
Обратите внимание, что коллекция AllUsers может не содержать элемент, если пользователь не просматривал сайт. - person Alex Nolasco; 07.10.2009
comment
Почему бы просто не использовать oUser.ID вместо UserToken? - person Chaulky; 17.09.2010

Пробовали ли вы использовать RunWithElevatedPrivileges?

SPSecurity.RunWithElevatedPrivileges(delegate()
        {
             //put your code here to get the group and test for the user
        });
person cjuk    schedule 30.06.2009
comment
Нет, это ничего не меняет. Индексатор по-прежнему выдает исключение. - person Flo; 30.06.2009
comment
Это должен быть комментарий, а не ответ... вы «ответили» другим вопросом. - person trgraglia; 27.10.2011

Чтобы заставить SPSecurity.RunWith.. работать, вам нужно иметь новый экземпляр объекта SPSite и/или SPWeb и не использовать контекст, иначе он не будет работать.

У вас есть объект SPUser для использования? Если это так, вы можете просто использовать коллекцию SPUser.Groups.

person Robin Meuré    schedule 01.07.2009

Я реализовал простой способ проверить, существует ли определенный пользователь в определенной группе SharePoint. Простой оператор с linq на объекте SPUser.

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

Найдите подробный пост в Основные решения SharePoint.

person user21394    schedule 17.12.2013