2

良い一日!

私のオーチャードには、いくつかのコンテンツ タイプがあり、そのすべてにカスタム パーツがアタッチされています。この部分は、このコンテンツを利用できるユーザーを定義します。ログに記録されたユーザーごとに、ユーザーがアクセスできるコンテンツとアクセスできないコンテンツを定義する外部サービスがあります。ここで、オーチャードがコンテンツ リストを表示するすべての場所にアクセス制限を適用する必要があります。これには、タグ クラウドからの特定のタグによる結果、または分類用語からリストされた結果が含まれます。TaxonomyServices コードと TagCloud サービスを変更して、自分の部分も結合してフィルタリングする以外に、それを行う良い方法が見つからないようです。これが実際にそれを行う唯一の方法ですか、それとも他の解決策がありますか? 可能であれば組み込みモジュールの変更を避けたいのですが、他の方法が見つかりません。

前もって感謝します。

4

1 に答える 1

0

私は現在、同じ問題に悩まされています。私が現在検討している 1 つの方法は、コンテンツ マネージャーに接続することです。

[OrchardSuppressDependency("Orchard.ContentManagement.DefaultContentManager")]
    public class ModContentManager : DefaultContentManager, IContentManager
    {
        //private readonly Lazy<IShapeFactory> _shapeFactory;
        private readonly IModAuthContext _modAuthContext;

        public ModContentManager(IComponentContext context,
            IRepository<ContentTypeRecord> contentTypeRepository,
            IRepository<ContentItemRecord> contentItemRepository,
            IRepository<ContentItemVersionRecord> contentItemVersionRepository,
            IContentDefinitionManager contentDefinitionManager,
            ICacheManager cacheManager,
            Func<IContentManagerSession> contentManagerSession,
            Lazy<IContentDisplay> contentDisplay,
            Lazy<ISessionLocator> sessionLocator,
            Lazy<IEnumerable<IContentHandler>> handlers,
            Lazy<IEnumerable<IIdentityResolverSelector>> identityResolverSelectors,
            Lazy<IEnumerable<ISqlStatementProvider>> sqlStatementProviders,
            ShellSettings shellSettings,
            ISignals signals,
            //Lazy<IShapeFactory> shapeFactory, 
            IModAuthContext modAuthContext)
            : base(context,
                contentTypeRepository,
                contentItemRepository,
                contentItemVersionRepository,
                contentDefinitionManager,
                cacheManager,
                contentManagerSession,
                contentDisplay,
                sessionLocator,
                handlers,
                identityResolverSelectors,
                sqlStatementProviders,
                shellSettings,
                signals) {
            //_shapeFactory = shapeFactory;
            _modAuthContext = modAuthContext;
        }

        public new dynamic BuildDisplay(IContent content, string displayType = "", string groupId = "") {
            // So you could do something like... 
            // var myPart = content.As<MyAuthoPart>();
            // if(!myPart.IsUserAuthorized)...
            // then display something else or display nothing (I think returning null works for this but 
            //don't quote me on that. Can always return a random empty shape)

            // else return base.BuildDisplay(content, displayType, groupId);

            // ever want to display a shape based on the name...
            //dynamic shapes = _shapeFactory.Value;
        }
    }
}

また、メインの ItemController の前にアクティブ化される IAuthorizationServiceEventHandler にフックし、プロジェクションまたは分類リストをレンダリングしているかどうかを確認するチェックを実行して、コンテンツ マネージャーにチェックを実行するように指示する値を設定することもできます。役立つかもしれません :)

于 2014-12-05T17:12:13.203 に答える