实现逻辑以提供基于角色的视图数据
本文关键字:角色 数据 视图 于角色 实现 | 更新日期: 2023-09-27 18:07:23
我在过去的几天里一直在思考这个问题,我想知道其他人是怎么看待这个问题的。我想实现一些基于用户所属角色的内容。我们的应用程序使用HTTP头来接收角色信息。在MVC中,我应该让控制器处理角色检测,然后传递一个布尔值到视图模型。
Viewmodel:
public class ProductViewModel
{
public Product MyProduct { get; set; }
public bool IsAdmin { get; set; }
public bool IsSuperAdmin { get; set; }
}
控制器:
public class ProductController : Controller
{
public ActionResult Info()
{
//get product information here
ProductViewModel pvm = new pvm();
pvm.Product = theProduct;
pvm.IsAdmin = checkAdminAccess(); //This would return a bool if they had access
pvm.IsSuperAdmin = checkSuperAdminAccess();//This would return a bool if they had access
return View(pvm);
}
}
视图:
@if(Model.IsAdmin == true || Model.IsSuperAdmin == true)
{
//Render Content for admin (Either directly or via Partial View)
}
@if(Model.IsSuperAdmin == true)
{
//Render Superadmin content (Either directly or via Partial View)
}
//Implement other Product Stuff Here
或者创建一个局部视图并处理视图中的逻辑会更好吗?这看起来涉及的工作少了。
@if (Request.Headers.AllKeys.Contains("role")){
ViewBag.Role = Request.Headers["role"].ToString();
}
...
@if(ViewBag.Role == "Admin" || ViewBag.Role == "SuperAdmin")
{
@Html.Partial("AdminPartial")//Or Render Code Directly?
if(ViewBag.Role == "SuperAdmin")
{
@Html.Partial("SuperAdminPartial")//Or Render Code Directly?
}
}
//Implement other Product Stuff Here
这样或那样做是否有任何额外的好处,我应该直接呈现内容或使用部分视图还是无关紧要?还是我遗漏了其他应该做的方法?
您可以使用AuthorizeAttribute来限制访问/使用控制器动作:
[Authorize(Roles = "Admin, Customer")]
public class ProductController : Controller
{
public ActionResult Info()
{
//get product information here
ProductViewModel pvm = new pvm();
return View(pvm);
}
[Authorize(Roles = "Admin")]
public ActionResult EditInfo()
{
//get product information here
EditProductViewModel epvm = new epvm();
return View(epvm);
}
}
这是限制调用者访问操作方法的最基本方法。然而,对于具有许多角色/控制器/操作的大型应用程序,注释和跟踪所有属性可能会变得困难。
有一个叫做Fluent Security的产品,它允许在一个中心位置指定安全性,从而消除了前面提到的问题。
还有一个单一责任原则的问题,看看Darin对这个问题的回答——他解释得很好。