0

我正在建立一个 Umbraco 8 站点来创建原型。
当我使用 Starter Kit 的默认代码时,我想更改顶部导航的行为。
目前您只能隐藏所有访问者的页面,但我只想隐藏基于成员(组)权限的页面。

我知道,您可以检查成员是否具有 Role.IsUserInRole 的角色,但我看不到获取页面允许角色的方法。

我是否需要获取角色并循环访问它们?
如果是,我如何获得它们?
如果不是,那么正确的方法是什么?

4

2 回答 2

0

我不知道 Roles 和 Pages 之间存在内置依赖关系,因此您可以获得页面的角色,但考虑设置您需要的某些角色,即ProFreeMonthly Membership ...

对于每个角色,您可以显示/隐藏特定内容,并使用GetAllRoles方法获取数据库中的所有角色。

然后遍历角色并检查登录用户是否是成员,以授予他正确的访问权限。


在您发表第二条评论后,我浏览了一个 Umbraco V8 演示,其中我应用了我为您建议的以下内容:

  1. 创建组 A 和 B

  2. 创建成员 A & B

  3. 创建登录和注销表单

  4. 创建 3 个模板 Master、Login 和 Page

  5. 创建 3 种文档类型 Master、Login 和 Page

  6. 创建一个父内容,即主页

  7. 创建三个子内容,即登录、A 和 B

  8. 为组 A 的成员显示导航菜单项 A

  9. 为组 B 的成员显示导航菜单项 B

  10. 拒绝未注册会员访问页面 A

  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>
于 2019-07-26T20:37:41.023 回答
0

我是这样工作的:

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>
}

也许这需要更多的工作,因为我猜性能不是很好。

于 2019-08-06T17:48:28.317 回答