使用Orchard 1.6 Iv创建了一个新角色'FactoryWorker'。当该用户从前端登录时,我希望它们仅导航到一个页面。
OrchardLocal /系统/ ManufacturedProducts
我已将此页面设置为订单详细信息的打印屏幕,以便工厂工人知道哪些产品可以用于发货&它们无法导航,因为没有菜单出现,但也需要阻止其他页面,因为用户决定输入他们允许访问的页面的URL。
这是我希望此特定用户能够访问的唯一页面(登录后),并且我添加了一个注销按钮,该按钮会将用户注销并返回主页。
所以我一直在寻找编辑角色,权限和内容等......但这一切似乎都适用于一般的表单和内容。用户可以访问任何内容类型等...
有人可以告诉我如何做到这一点吗? 谢谢你的回复
更新 我忘了提到这不是我所说的内容类型,项目或部分。 我创建了自己的控制器&查看&可从仪表板访问的VM(使用AdminMenu,将管理员用户带到OrchardLocal / System / ManufacturedProducts)
我查看了Orchard.ContentPermissions功能,但它似乎只允许我1)授予他人权限或2)授予自己内容的权限
任何想法?
答案 0 :(得分:4)
您可以使用请求过滤器,(我不知道这是否是最佳方式):
FilterProvider - 定义应用于每个请求的过滤器。类似于默认的ASP.NET MVC动作过滤器的工作方式,区别在于它不是属性。所有FilterProvider对象都被注入请求管道并应用于所有请求(因此您需要在适当的方法开始时检查当前请求是否适合您的过滤器)。
来自:http://www.szmyd.com.pl/blog/most-useful-orchard-extension-points
所以你可以实现类似的东西
public class Filter : FilterProvider, IAuthorizationFilter {
private readonly IAuthenticationService _authenticationService;
public Filter(IAuthenticationService authenticationService) {
_authenticationService = authenticationService;
}
public void OnAuthorization(AuthorizationContext filterContext) {
//If route is the restricted one
if (filterContext.HttpContext.Request.Url.AbsoluteUri.Contains("OrchardLocal/System/ManufacturedProducts")) {
//Get the logged user
IUser loggedUser = _authenticationService.GetAuthenticatedUser();
if (loggedUser == null)
return filterContext.Result = new HttpUnauthorizedResult();
//Get the Roles
var roles = loggedUser.As<IUserRoles>().Roles;
if (!roles.Contains("FactoryUser")) {
//User is not authorized
return filterContext.Result = new HttpUnauthorizedResult();
}
}
}
}
注意:未经测试的代码!
编辑:您也可以反转逻辑并检查记录的用户是否具有“FactoryUser”角色,并限制其访问除他们应该看到的页面之外的每个页面。
答案 1 :(得分:3)
您的模块可以创建新权限(查看其中一个permissions.cs文件以获取示例),然后创建仅具有该权限的角色。让您的控制器操作检查该权限(同样,通过查找其中一个permissions.cs中定义的权限的用法找到许多示例)。
答案 2 :(得分:2)
您可以使用Content Permissions module。使用此模块,您可以将内容项权限部分附加到内容类型。此部分允许您选择在创建内容时可以查看内容的角色。