You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Orchard自定义News模块设置权限,实现编辑器登录隐藏删除按钮

嘿,我来帮你搞定这个News模块的自定义权限,实现编辑器登录后隐藏仪表盘删除按钮的需求~ 咱们一步步来:

第一步:补全并完善Permission.cs代码

你提供的代码没写完,我帮你补全并做了优化,还加了更细粒度的删除权限(方便后续灵活控制):

using System;
using System.Collections.Generic;
using Orchard.Environment.Extensions.Models;
using Orchard.Security.Permissions;

namespace News {
    public class Permissions : IPermissionProvider {
        // 总控权限:拥有它自动获得所有新闻管理权限
        public static readonly Permission ManageNews = new Permission { 
            Description = "Full management access to News (includes delete)", 
            Name = "ManageNews" 
        };

        // 单独的删除权限,方便给不同角色分配
        public static readonly Permission DeleteNews = new Permission { 
            Description = "Delete existing News items", 
            Name = "DeleteNews",
            ImpliedBy = new[] { ManageNews } // 拥有ManageNews的用户自动获得删除权限
        };

        // 返回模块所有自定义权限
        public IEnumerable<Permission> GetPermissions() {
            return new[] { ManageNews, DeleteNews };
        }

        // 给系统默认角色分配权限模板
        public IEnumerable<PermissionStereotype> GetDefaultStereotypes() {
            return new[] {
                new PermissionStereotype {
                    Name = "Administrator",
                    Permissions = new[] { ManageNews } // 管理员拥有全部权限
                },
                new PermissionStereotype {
                    Name = "Editor",
                    Permissions = new[] { /* 这里不给DeleteNews,编辑器就没删除权限 */ }
                }
            };
        }

        // 模块特性,Orchard框架需要的属性
        public Feature Feature { get; set; }
    }
}
第二步:控制仪表盘删除按钮的显示

接下来要在仪表盘的新闻视图里,通过权限服务判断当前用户是否拥有删除权限,只有有权限才显示按钮。

假设你的仪表盘新闻视图路径是Views/Dashboard/News.cshtml,代码可以这么写:

@using Orchard.Security
@{
    // 从工作上下文获取权限服务
    var permissionService = WorkContext.Resolve<IPermissionService>();
    // 判断当前用户是否有删除新闻的权限
    var canDeleteNews = permissionService.Authorize(News.Permissions.DeleteNews, WorkContext.CurrentUser);
}

<!-- 你的新闻列表渲染代码 -->
@foreach (var newsItem in Model.NewsItems)
{
    <div class="news-item-card">
        <h4>@newsItem.Title</h4>
        <p>@newsItem.ShortContent</p>
        
        <!-- 只有有权限才显示删除按钮 -->
        @if (canDeleteNews)
        {
            <a href="@Url.Action("Delete", "NewsAdmin", new { id = newsItem.Id })" 
               class="btn btn-danger btn-sm" 
               onclick="return confirm('确定要删除这条新闻吗?')">
                删除
            </a>
        }
    </div>
}

如果你的仪表盘是通过驱动(Driver)来渲染的,也可以在驱动层先判断权限,再把权限状态传给视图:

using Orchard;
using Orchard.UI.Navigation;
using News.Models;

namespace News.Drivers {
    public class DashboardNewsDriver : IDriver {
        private readonly IPermissionService _permissionService;
        private readonly IWorkContextAccessor _workContextAccessor;

        // 构造函数注入所需服务
        public DashboardNewsDriver(IPermissionService permissionService, IWorkContextAccessor workContextAccessor) {
            _permissionService = permissionService;
            _workContextAccessor = workContextAccessor;
        }

        public DriverResult Display() {
            var workContext = _workContextAccessor.GetContext();
            // 判断当前用户的删除权限
            var canDelete = _permissionService.Authorize(Permissions.DeleteNews, workContext.CurrentUser);
            
            // 组装视图模型
            var viewModel = new DashboardNewsViewModel {
                NewsItems = FetchLatestNewsItems(), // 替换成你的获取新闻逻辑
                CanDeleteNews = canDelete
            };

            return ContentShape("Dashboard_News", () => View("Dashboard/News", viewModel));
        }

        // 模拟获取新闻列表的方法
        private IEnumerable<NewsItem> FetchLatestNewsItems() {
            // 这里写你获取新闻数据的逻辑
            return new List<NewsItem>();
        }
    }
}

对应的视图里就可以直接用Model.CanDeleteNews来判断,写法和之前的视图一致。

第三步:确保模块依赖正确

最后别忘了在你的模块根目录的Module.txt里添加对Orchard.Security的依赖,不然权限系统没法正常工作:

Name: News
AntiForgery: enabled
Author: Your Name
Website: your-site.com
Version: 1.0.0
OrchardVersion: 1.10+
Description: Custom news module with granular permission control
Dependencies: Orchard.Security

这样设置后,编辑器角色默认没有DeleteNews权限,登录后仪表盘上的删除按钮就会被隐藏;而管理员因为拥有ManageNews权限,会自动继承删除权限,能正常看到删除按钮。

内容的提问来源于stack exchange,提问作者Reza Rouf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:20:39