如何为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
相关产品推荐
相关产品推荐

