Orchardcms 如何防止在Orchard admin中列出用户无权访问的内容项?

Orchardcms 如何防止在Orchard admin中列出用户无权访问的内容项?,orchardcms,orchardcms-1.6,Orchardcms,Orchardcms 1.6,在一个不同的用户/角色只能查看和编辑特定内容的站点上,正在处理一些权限/身份验证扩展。即使在使用ContentPermissions模块时,用户没有查看和编辑权限的项目仍会在/Admin/Content/List页面中枚举(然后,当您单击该页面时,访问被拒绝) 有什么办法可以完全防止这种情况发生吗?我在源代码中翻了翻,在那个阶段看起来根本没有考虑权限: 从乌节.Core.Contents.Controllers.AdminController.cs开始: public ActionResult

在一个不同的用户/角色只能查看和编辑特定内容的站点上,正在处理一些权限/身份验证扩展。即使在使用ContentPermissions模块时,用户没有查看和编辑权限的项目仍会在/Admin/Content/List页面中枚举(然后,当您单击该页面时,访问被拒绝)

有什么办法可以完全防止这种情况发生吗?我在源代码中翻了翻,在那个阶段看起来根本没有考虑权限:

从乌节.Core.Contents.Controllers.AdminController.cs开始:

public ActionResult List(ListContentsViewModel model, PagerParameters pagerParameters) {
        Pager pager = new Pager(_siteService.GetSiteSettings(), pagerParameters);

        var query = _contentManager.Query(VersionOptions.Latest, GetCreatableTypes(false).Select(ctd => ctd.Name).ToArray());

        if (!string.IsNullOrEmpty(model.TypeName)) {
            var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(model.TypeName);
            if (contentTypeDefinition == null)
                return HttpNotFound();

            model.TypeDisplayName = !string.IsNullOrWhiteSpace(contentTypeDefinition.DisplayName)
                                        ? contentTypeDefinition.DisplayName
                                        : contentTypeDefinition.Name;
            query = query.ForType(model.TypeName);
        }

        switch (model.Options.OrderBy) {
            case ContentsOrder.Modified:
                //query = query.OrderByDescending<ContentPartRecord, int>(ci => ci.ContentItemRecord.Versions.Single(civr => civr.Latest).Id);
                query = query.OrderByDescending<CommonPartRecord>(cr => cr.ModifiedUtc);
                break;
            case ContentsOrder.Published:
                query = query.OrderByDescending<CommonPartRecord>(cr => cr.PublishedUtc);
                break;
            case ContentsOrder.Created:
                //query = query.OrderByDescending<ContentPartRecord, int>(ci => ci.Id);
                query = query.OrderByDescending<CommonPartRecord>(cr => cr.CreatedUtc);
                break;
        }

        model.Options.SelectedFilter = model.TypeName;
        model.Options.FilterOptions = GetCreatableTypes(false)
            .Select(ctd => new KeyValuePair<string, string>(ctd.Name, ctd.DisplayName))
            .ToList().OrderBy(kvp => kvp.Value);

        var pagerShape = Shape.Pager(pager).TotalItemCount(query.Count());
        var pageOfContentItems = query.Slice(pager.GetStartIndex(), pager.PageSize).ToList();

        var list = Shape.List();
        list.AddRange(pageOfContentItems.Select(ci => _contentManager.BuildDisplay(ci, "SummaryAdmin")));

        dynamic viewModel = Shape.ViewModel()
            .ContentItems(list)
            .Pager(pagerShape)
            .Options(model.Options)
            .TypeDisplayName(model.TypeDisplayName ?? "");

        // Casting to avoid invalid (under medium trust) reflection over the protected View method and force a static invocation.
        return View((object)viewModel);
    }
public ActionResult列表(ListContentsViewModel模型、PagerParameters PagerParameters){
Pager Pager=新的寻呼机(_siteService.GetSiteSettings(),pagerParameters);
var query=\u contentManager.query(VersionOptions.Latest,GetCreatableTypes(false).Select(ctd=>ctd.Name).ToArray());
如果(!string.IsNullOrEmpty(model.TypeName)){
var contentTypeDefinition=\u contentDefinitionManager.GetTypeDefinition(model.TypeName);
if(contentTypeDefinition==null)
返回HttpNotFound();
model.TypeDisplayName=!string.IsNullOrWhiteSpace(contentTypeDefinition.DisplayName)
?contentTypeDefinition.DisplayName
:contentTypeDefinition.Name;
query=query.ForType(model.TypeName);
}
开关(model.Options.OrderBy){
案例内容排序器。已修改:
//query=query.OrderByDescending(ci=>ci.ContentItemRecord.Versions.Single(civr=>civr.Latest.Id);
query=query.OrderByDescending(cr=>cr.ModifiedUtc);
打破
案例内容排序器。已发布:
query=query.OrderByDescending(cr=>cr.C);
打破
案例内容排序器。已创建:
//query=query.OrderByDescending(ci=>ci.Id);
query=query.OrderByDescending(cr=>cr.CreatedUtc);
打破
}
model.Options.SelectedFilter=model.TypeName;
model.Options.FilterOptions=GetCreatableTypes(false)
.Select(ctd=>newkeyvaluepair(ctd.Name,ctd.DisplayName))
.ToList().OrderBy(kvp=>kvp.Value);
var pagerShape=Shape.Pager(Pager.TotalItemCount(query.Count());
var pageOfContentItems=query.Slice(pager.GetStartIndex(),pager.PageSize).ToList();
var list=Shape.list();
list.AddRange(page of contentitems.Select(ci=>\u contentManager.BuildDisplay(ci,“SummaryAdmin”));
动态视图模型=Shape.viewModel()
.ContentItems(列表)
.寻呼机(寻呼机形状)
.Options(model.Options)
.TypeDisplayName(model.TypeDisplayName??);
//强制转换以避免对受保护视图方法的无效(在中等信任下)反射并强制静态调用。
返回视图((对象)视图模型);
}
在任何阶段,权限都不会被检查


我真的不想编辑默认的Orchard模块;是否有我遗漏的任何其他扩展点,或者其他人的任何想法(或者我必须咬紧牙关编辑AdminController吗?

您应该能够覆盖到内容列表的路由,并将其重定向到您自己的操作,您可以在其中添加权限。老实说,并不是每个新版本的Orchard在升级时都不会带来很多问题,所以修改一点核心代码在总体方案中并不重要能够用您自己的视图覆盖视图并在那里添加权限…我相信第一种选择是最好的。覆盖此操作,添加具有权限检查逻辑的自定义控制器。