Umbraco: как проверить, разрешен ли участнику программный доступ к странице

Я настраиваю сайт Umbraco 8 для создания прототипа.
Поскольку я играю с кодом по умолчанию для Starter Kit, я хотел изменить поведение верхней навигации.
В настоящее время вы можете только скрыть страницы для всех посетителей, но я хочу скрыть страницы только на основе разрешений членов (группы).

Я вижу, что вы можете проверить, находится ли участник в роли с помощью Role.IsUserInRole, но я не вижу способа получить разрешенные роли для страницы.

Нужно ли мне получать роли и перебирать их?
Если да, то как их получить?
Если нет, то как правильно это сделать?


person Lars-Pascal Körber    schedule 25.07.2019    source источник


Ответы (2)


У меня это работает следующим образом:

IContent content = base.Services.ContentService.GetById(item.Id);
PublicAccessEntry entry = base.Services.PublicAccessService.GetEntryForContent(content);
if (entry != null)
{
    foreach (var r in entry.Rules)
    {
        if (Roles.IsUserInRole(r.RuleValue))
        {
            <a class="nav-link @(item.IsAncestorOrSelf(Model) ? "nav-link--active" : null)" href="@item.Url">@item.Name</a>
        }
    }
}
else
{
    <a class="nav-link @(item.IsAncestorOrSelf(Model) ? "nav-link--active" : null)" href="@item.Url">@item.Name</a>
}

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

person Lars-Pascal Körber    schedule 06.08.2019

Я не знаю, существует ли встроенная зависимость между ролями и страницами, поэтому вы получаете роли для страницы, но рассмотрите возможность установки определенных ролей, которые вам нужны, например Pro, Free, Ежемесячная подписка...

Для каждой роли вы можете показывать/скрывать определенный контент, а для получения всех ролей в вашей базе данных используйте GetAllRoles.

Затем прокрутите роли и проверьте, является ли зарегистрированный пользователь участником или нет, чтобы предоставить ему право доступа.


После вашего второго комментария я просмотрел демонстрацию Umbraco V8, в которой я применил следующее, что я предлагаю вам:

  1. Создать группы А и Б

  2. Создать участников A и B

  3. Создать форму входа и выхода

  4. Создайте 3 шаблона Master, Login и Page

  5. Создайте 3 типа документов Мастер, Логин и Страница

  6. Создайте один родительский контент, т.е. домашнюю страницу

  7. Создайте три дочерних содержимого, т.е. Логин, A и B

  8. Показать пункт меню навигации A для членов группы A

  9. Показать пункт меню навигации B для членов группы B

  10. Запретить доступ к странице А для незарегистрированных пользователей

  11. Запретить доступ к странице B для незарегистрированных участников

Предварительный просмотр:

Членство в Umbraco

Код, используемый в пунктах 8 и 9:

@{ 
    var isMemberofB = false;
    var isMemberofA = false;
}

 @{
            var myUser = System.Web.Security.Membership.GetUser();
            if (myUser != null)
            {
                <p class="ui red sub header">
                    <i class="user icon"></i>
                    you're logged in as @myUser.UserName
                    @{
                        isMemberofB = System.Web.Security.Roles.IsUserInRole(myUser.UserName, "B");
                        if (isMemberofB)
                        {
                        <p class="ui green sub header">
                            <i class="user icon"></i>
                            you're a member of role B
                        </p>
                    }
                    else
                    {
                        isMemberofA = System.Web.Security.Roles.IsUserInRole(myUser.UserName, "A");
                        if (isMemberofA)
                        {
                            <p class="ui green sub header">
                                <i class="user icon"></i>
                                you're a member of role A
                            </p>
                        }
                    }
                    }
                    @*This example shows how to use lazy loaded images, a sticky menu, and a simple text container*@
                    </p>
                }
        }

          <a href="#" class="ui right floated dropdown item">
            Dropdown <i class="dropdown icon"></i>
                     <div class="menu">
                         @if (isMemberofA)
                         {
                             <div class="item">Link To Page A</div>
                         }
                         @if (isMemberofB)
                         {
                             <div class="item">Link To Page B</div>
                         }
                         <div class="divider"></div>
                         <div class="header">Header Item</div>
                         <div class="item">
                             <i class="dropdown icon"></i>
                             Sub Menu
                             <div class="menu">
                                 <div class="item">Link Item</div>
                                 <div class="item">Link Item</div>
                             </div>
                         </div>
                         <div class="item">Link Item</div>
                     </div>
          </a>
person Abuabdellah    schedule 26.07.2019
comment
Я не уверен, правильно ли я вас понял. Насколько я понимаю, вы предлагаете проверять, есть ли у участника какие-либо роли, вместо того, чтобы проверять конкретную роль. Я прав? Если да, то мне это не подходит. - person Lars-Pascal Körber; 01.08.2019
comment
Я не вижу разницы, когда вы сказали. Как я вас понимаю, вы предлагаете проверять, есть ли у участника какие-либо роли, вместо того, чтобы проверять конкретную роль. Если вы знаете имя роли, проверьте только его. Цитата: Вы упомянули, что я хочу скрывать страницы только на основе разрешений участников (группы), на случай, если есть другой способ, отличный от того, что я ответил, я хочу знать об этом. - person Abuabdellah; 01.08.2019
comment
Позвольте мне привести вам пример: участник A имеет роль A. Страница B доступна только для участников с ролью B. Я хочу скрыть страницу B в навигации для участников, которые не являются частью роли B. Как я могу узнать в навигации управления, что Страница B разрешена только для роли B? - person Lars-Pascal Körber; 02.08.2019
comment
Как вы делаете шаги 8 и 9, потому что это на самом деле то, что я ищу, только то, что я написал о черном списке, а вы пишете о белом списке. Как вы можете видеть из моего собственного ответа, я решил проблему программно, но если есть готовое решение, это был бы лучший способ. - person Lars-Pascal Körber; 06.08.2019
comment
О, хорошо, вы делаете это жестко закодированным. Поэтому, если вы добавите другую роль, вам придется обновить эту. Я думаю, что мое решение больше подходит, так как оно динамическое. Но спасибо за старания :) - person Lars-Pascal Körber; 07.08.2019