【问题标题】:Umbraco: How to check if a member is allowed to access a page programmaticallyUmbraco:如何检查是否允许成员以编程方式访问页面
【发布时间】:2019-07-25 20:35:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: permissions umbraco member umbraco8


    【解决方案1】:

    我是这样工作的:

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

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

    【讨论】:

      【解决方案2】:

      我不知道角色和页面之间存在内置依赖关系,因此您可以获取页面的角色,但请考虑设置您需要的某些角色,即 Pro、Free, 每月会员...

      对于每个角色,您可以显示/隐藏特定内容,并使用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

      预览:

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

      【讨论】:

      • 我不确定,如果我理解正确的话。据我了解,您建议检查成员是否具有任何角色,而不是检查特定角色。我对吗?如果是,那么这不适合我。
      • 我看不出有什么区别,据我了解,您建议检查成员是否有任何角色,而不是检查特定角色。如果您知道角色名称,则仅检查它。引用:您提到“我只想根据成员(组)权限隐藏页面”,以防除了我回答的内容之外还有其他方法我想知道。
      • 举个例子:成员 A 有角色 A。页面 B 仅供角色 B 中的成员访问。我想在导航中为不属于角色 B 的成员隐藏页面 B . 我如何在导航控件中知道页面 B 只允许角色 B 使用?
      • 您如何执行第 8 步和第 9 步,因为这实际上是我正在寻找的内容,只是我写的是关于黑名单的内容,而您正在写的是关于白名单的内容。正如您可能从我自己的回答中看到的那样,我以编程方式解决了问题,但如果有现成的解决方案,那将是更好的方法。
      • 哦,好吧,你是硬编码的。因此,如果您添加另一个角色,则必须对其进行更新。我认为我的解决方案更合适,因为它是动态的。但是感谢您的努力:)
      猜你喜欢
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多