Umbraco 7隐藏用户无法访问的导航节点



我在之前版本的Umbraco(即5)中看到过一些例子,其中这似乎相对简单。参见这个stackoverflow问题。

理论是,我可以在节点上使用属性HasAccessIsProtected,或者在选择使用哪些节点时使用方法WhereHasAccess

到目前为止,我的代码是:
var nodes = @CurrentPage.AncestorsOrSelf(1).First().Children;

这可以让我得到页面列表,没问题。然而,我正在努力过滤页面列表,以便登录用户只看到他们有权访问的页面,而公共访问者看不到受保护的页面。

V5代码表明这是可能的:

var nodes = @CurrentPage.AncestorsOrSelf(1).First().Children.WhereCanAccess();

但是这会导致错误:

'Umbraco.Web.Models.DynamicPublishedContentList' does not contain a definition for 'WhereCanAccess'

最新发布的Razor Umbraco备查表表明,HasAccess()IsProtected()是两个方法,都是可用的,但当使用其中任何一个时,我得到空值,例如:

@foreach(var node in nodes.WhereCanAccess()) {
    <li>@node.Name / @node.IsProtected / @node.IsProtected() / @node.HasAccess() / @node.HasAccess </li>
}

为所有测试值返回null(例如@node.IsProtected)。

我想要达到的目标似乎很简单,但我的方法是错误的。有人能指出我的错误吗?

我检查用户对页面的访问权限:

var node = [the page you want to verify access to ie. "CurrentPage"];
var isProtected = umbraco.library.IsProtected(node.id, node.path);
var hasAccess = umbraco.library.HasAccess(item.id, item.path);

顶部菜单代码:

   var homePage = CurrentPage.AncestorsOrSelf(1).First();
    var menuItems = homePage.Children.Where("UmbracoNaviHide == false");
    @foreach (var item in menuItems)
    {
        var loginAcces = umbraco.library.IsProtected(item.id, item.path) && umbraco.library.HasAccess(item.id, item.path);
        var cssClass = loginAcces ? "loginAcces ":"";
        cssClass += CurrentPage.IsDescendantOrSelf(item) ? "current_page_item" :"";                           
        if(!umbraco.library.IsProtected(item.id, item.path) || loginAcces){
            [render your item here]
        }
}

这将隐藏受保护的项,除非用户登录并具有访问权限。

感谢@user3815602,我是这样做的

创建一个扩展方法

namespace CPalm.Core
{
    public static class ExtensionMethods
    {
        public static bool CurrentUserHasAccess(this IPublishedContent content)
        {
            int contentId = content.Id;
            string contentPath = content.Path;
            bool isProtected = umbraco.library.IsProtected(contentId, contentPath);
            if (isProtected)
            {
                bool hasAccess = umbraco.library.HasAccess(contentId, contentPath);
                if (!hasAccess)
                    return false;
            }
            return true;
        }
    }
}

可以这样使用

foreach (IPublishedContent content in CurrentPage.AncestorsOrSelf(1).First().Children)
{
    if (!content.CurrentUserHasAccess())
        continue;
    /* The current user has access to the content */
}

我有另一种方法来实现它。

Model.Content.Children.Where(o => Umbraco.IsProtected(o.Id, o.Path)).Any()

相关内容

  • 没有找到相关文章

最新更新