Всемогущий, Google, найди мне чего-нибудь!

понедельник, 22 февраля 2010 г.

Скрытие элементов карты сайта

Итак, сегодня речь пойдет о проекте, который я нашел на сайте Codeplex - ASP.NET MVC SiteMap provider - MvcSiteMap.

Естественно, что практически на любом сайте есть разделение по ролям (чаще всего это анонимные и зарегистрированные пользователи, а также администраторы), для которых может по-разному отображаться карта сайта. Карта сайта по ролям пользователей:
 Рис. 1. Карта сайта для администратора

Рис. 2. Карта сайта для зарегистрированного пользователя

Рис. 3. Карта сайта для анонимного пользователя


Теперь вопрос был в том, как же скрыть элементы карты сайта в зависимотси от роли пользователя. Перед тем, как читать дальше, советую прочитать эту статью: "Карта сайта в ASP.NET MVC приложении". Теперь, когда вы прочитали её, идём дальше. У элемента <Sitemap/> если аттрибут securityTrimmingEnabled, который для начала необходимо установить в true. Он-то и есть ключевым моментом в данной статье. Теперь разберёмся, что же делает этот аттрибут:
Теория: Общие требования безопасности для всех веб-сайтов заключаются в том, чтобы позволить только некоторым зарегистрированным (или группе) пользователям просматривать определенные страницы. Управление ролями в ASP.NET позволяет ограничить доступ к веб-ресурсам сайта, основываясь на роли пользователя. Также это касается и элемента Sitemap, позволяя скрывать определенные элементы дерева, основываясь на роли пользователя.
Несмотря на то, что элемент Sitemap скрывает ссылки в дереве, страницы также должны быть ограничены в доступе (например, посредством <location/>). Также ограничение к элементам дерева работает и с пользовательскими провайдерами карты сайта (что я вам и покажу).
Теперь практика. Например, нам необходимо скрыть элемент Privacy от анонимных пользователей. Для этого необходимо указать все роли, которые могут видеть данный элемент дерева, т.е. User и Administrator. Наша простенькая карта сайта будет выглядеть примерно так:
<mvcSiteMapNode title="Home" controller="Home" action="Index" >
 <mvcSiteMapNode title="About" controller="Home" action="About" />
 <mvcSiteMapNode title="Privacy" controller="Home" action="Privacy" roles="User,Administrator"/>
</mvcSiteMapNode>
Теперь элемент не будет виден анонимным пользователям на странице карты сайта. Чтобы сгенерировать дерево на странице, можно воспользоваться Html-Hepler'ом из пространства имен MvcSiteMap.Core.Helpers - HtmlHelper.SiteMap(). Теперь, когда вы разграничили доступ к элементам, то вы получите разные карты сайта в зависимости от роли пользователя. Вуаля!

P.S. Также это работает и для класса XmlSiteMapProvider и <SiteMapNode />.

3 комментария:

Unknown комментирует...

Не работает, независимо от роли отражается пункт меню "Пользователи":




Unknown комментирует...
Этот комментарий был удален автором.
Unknown комментирует...
Этот комментарий был удален автором.