Umbraco:如何检查是否允许成员以编程方式访问页面
Umbraco: How to check if a member is allowed to access a page programmatically
我正在建立一个 Umbraco 8 网站来创建原型。
当我在使用入门工具包的默认代码时,我想更改顶部导航的行为。
目前你只能为所有访问者隐藏页面,但我只想隐藏基于成员(组)权限的页面。
我明白了,您可以检查成员是否具有 Role.IsUserInRole 的角色,但我看不到获取页面允许角色的方法。
我需要获取角色并遍历它们吗?
如果是,我如何获得它们?
如果不是,正确的做法是什么?
我不知道角色和页面之间存在内置依赖关系,因此您获得了页面的角色,但考虑设置您需要的某些角色,即 Pro,免费、包月会员...
对于每个角色,您可以显示/隐藏特定内容,并使用 GetAllRoles 方法获取数据库中的所有角色。
然后遍历角色并检查登录用户是否是成员,是否授予他访问权限。
在你发表第二条评论后,我进行了 Umbraco V8 演示,其中应用了我为你推荐的以下内容:
创建组 A 和 B
创建成员 A 和 B
创建登录和注销表单
创建 3 个模板主、登录和页面
创建 3 种文档类型 Master、Login 和 Page
创建一个父内容,即主页
创建三个子内容,即登录、A 和 B
为组 A 的成员显示导航菜单项 A
为组 B 的成员显示导航菜单项 B
拒绝未注册会员访问页面 A
拒绝未注册会员访问页面 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>
我是这样工作的:
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>
}
也许这需要更多的工作,因为我猜性能不是那么好。
我正在建立一个 Umbraco 8 网站来创建原型。
当我在使用入门工具包的默认代码时,我想更改顶部导航的行为。
目前你只能为所有访问者隐藏页面,但我只想隐藏基于成员(组)权限的页面。
我明白了,您可以检查成员是否具有 Role.IsUserInRole 的角色,但我看不到获取页面允许角色的方法。
我需要获取角色并遍历它们吗?
如果是,我如何获得它们?
如果不是,正确的做法是什么?
我不知道角色和页面之间存在内置依赖关系,因此您获得了页面的角色,但考虑设置您需要的某些角色,即 Pro,免费、包月会员...
对于每个角色,您可以显示/隐藏特定内容,并使用 GetAllRoles 方法获取数据库中的所有角色。
然后遍历角色并检查登录用户是否是成员,是否授予他访问权限。
在你发表第二条评论后,我进行了 Umbraco V8 演示,其中应用了我为你推荐的以下内容:
创建组 A 和 B
创建成员 A 和 B
创建登录和注销表单
创建 3 个模板主、登录和页面
创建 3 种文档类型 Master、Login 和 Page
创建一个父内容,即主页
创建三个子内容,即登录、A 和 B
为组 A 的成员显示导航菜单项 A
为组 B 的成员显示导航菜单项 B
拒绝未注册会员访问页面 A
拒绝未注册会员访问页面 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>
我是这样工作的:
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>
}
也许这需要更多的工作,因为我猜性能不是那么好。