2

再会!

在我的 Orchard 中,我有几种内容类型,都附有我的自定义部分。这部分定义了哪些用户可以使用此内容。对于每个登录的用户,都有一个外部服务,它定义了用户可以访问或不能访问的内容。现在我需要访问限制来应用果园显示内容列表的任何地方,这包括来自标签云的特定标签的结果,或者从分类术语中列出的结果。除了修改 TaxonomyServices 代码和 TagCloud 服务之外,我似乎找不到任何好的方法来加入我的角色并通过它进行过滤。这确实是唯一的方法还是有其他解决方案?如果可能,我想避免对内置模块进行更改,但找不到其他方式。

提前致谢。

4

1 回答 1

0

我目前正在解决同样的问题。我目前正在研究的一种方法是连接到内容管理器。

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

还可以挂钩到 IAuthorizationServiceEventHandler,它之前在主 ItemController 中激活,并检查您是否正在呈现投影或分类列表设置一个值来告诉您的内容管理器执行检查,否则让它们通过。可能有帮助 :)

于 2014-12-05T17:12:13.203 回答