понедельник, 27 июня 2011 г.

Проверка принадлежности текущего пользователя к аудитории для элемента навигации SharePoint

Допустим, имеется набор элементов навигации SPNavigationNodeCollection (например, web.Navigation.TopNavigationBar или web.Navigation.QuickLaunch).
Необходимо выбрать из них элементы в соответствии с установленной для них аудиторией относительно текущего пользователя.


Для данной задачи я создал следующий класс:

public static class AudienceHelper
{
    public static bool UserInAudience(this SPNavigationNode navigationNode)
    {
        //Необходимые нам данные об аудитории находятся в свойстве элемента
        if (navigationNode.Properties["Audience"] == null)
            return true;

        var audiencesLine = navigationNode.Properties["Audience"].ToString();

        /*
         * В качестве значения для аудитории может быть установлено значение одного из трёх типов:
         * Аудитории SharePoint
         * Группы безопасности
         * Группы SharePoint
         *
         * Информация об аудитории представляет собой строку вида "MyAudience;;MySecurityGroup;;MySPGroup"
         * Значения между ";;" могут отсутствовать, либо быть набором из нескольких значений разделённых ","
         * Для примера,
         * аудитория SharePoint задаётся значением "MyAudience;;;;",
         * две группы SharePoint - значением ";;;;MySPGroup1,MySPGroup2"
         */

        var audiencesList = audiencesLine.Split(new[] { ";;" }, StringSplitOptions.None).ToList();
        if (string.IsNullOrEmpty(audiencesLine) || audiencesList.Count < 3)
            return true;

        /* Для проверки наличия текущего пользователя в аудитории необходим объект AudienceLoader
         * из библиотеки Microsoft.Office.Server*/
        var audienceLoader = AudienceLoader.GetAudienceLoader();

        #region Global audience

        if (!string.IsNullOrEmpty(audiencesList[0]))
        {
            var audiences = audiencesList[0].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (audiences.Any(audienceLoader.IsUserMemberOfGlobalAudience))
                return true;
        }

        #endregion

        #region
Security group

        if (!string.IsNullOrEmpty(audiencesList[1]))
        {
            var audiences = audiencesList[1].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (audiences.Any(audienceLoader.IsUserMemberOfDL))
                return true;
        }

        #endregion

        #region
SharePoint group

        if (!string.IsNullOrEmpty(audiencesList[2]))
        {
            var audiences = audiencesList[2].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (audiences.Any(audienceLoader.IsUserMemberOfSharePointGroup))
                return true;
        }

        #endregion

        //Если пользователь не содержится не в одном из типов аудиторий возвращаем False
        return false;
    }
}


Теперь можем перебрать все элементы:
foreach (var navItem in web.Navigation.TopNavigationBar.Cast<SPNavigationNode>().Where(nn => nn.IsVisible && nn.UserInAudience()))
{
    //Действия с элементом   
}

Комментариев нет:

Отправить комментарий