3

Umbraco の以前のバージョン (つまり 5) で、これが比較的簡単に見える例をいくつか見てきました。たとえば、このstackoverflowの質問を参照してください。

理論的には、使用するノードを選択するときに、プロパティHasAccessまたはIsProtectedノード、またはメソッドを使用できるというものです。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'

Umbracoの Razor チートシートの最新の公開バージョンは、HasAccess()IsProtected()が両方とも利用可能な 2 つの方法であることを示していますが、これらのいずれかを使用すると null 値が得られます。

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

すべてのテスト値に対して null を返します (例: @node.IsProtected)。

私が達成しようとしていることは単純なようですが、間違った方法でアプローチしています。誰か私のやり方の間違いを指摘してください!

4

3 に答える 3

9

次のようなページへのユーザー アクセスをチェックします。

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

これにより、ユーザーがログインしてアクセス権を持っていない限り、保護されているアイテムが非表示になります。

于 2014-07-08T09:00:57.740 に答える
2

@ user3815602 に感謝します

1 つの拡張メソッドを作成しました

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 */

}
于 2015-02-22T14:37:23.190 に答える