c# - MVC 限制对管理员的访问
问题描述
您好,目前我正在尝试在我的网站上创建一项功能,允许管理员看到一件事,而普通用户看到另一件事。这是我的代码
[RestrictAccess(restriction = AccessRestrictions.ModifySalesOrder)]
public ActionResult ChangeStatus(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
SalesOrder salesOrder = db.SalesOrders.Find(id);
if (salesOrder == null)
{
return HttpNotFound();
}
ViewBag.Invoice = false;
ViewBag.enoughStock = true;
switch (salesOrder.SalesOrderStatus)
{
case SOStatus.Pending:
ViewBag.statusList = new List<Object>
{
new {value = SOStatus.Pending, text = "Pending" },
new {value = SOStatus.Released, text = "Released" },
};
break;
case SOStatus.Released:
ViewBag.Invoice = true;
ViewBag.statusList = new List<Object>
{
new {value = SOStatus.Shipped, text = "Shipped" },
new {value = SOStatus.Close, text = "Close" },
};
break;
这是我的团体模型课
public class Groups
{
[Key]
public int ID { get; set; }
[Display(Name = "Group Name")]
public string GroupName { get; set; }
}
public class groupAccess
{
[Key]
public int ID { get; set; }
public AccessRestrictions restriction { get; set; }
public bool allow { get; set; }
public int groupID { get; set; }
}
这是 将用户分配给组 ID的userAccess 类
public class userAccess
{
[Key]
public int ID { get; set; }
public AccessRestrictions restriction { get; set; }
public bool allow { get; set; }
public int userID { get; set; }
public int groupID { get; set; }
}
我希望管理员能够在它发布时将其切换回待处理状态,但我不希望用户拥有该功能。我有一个组模型,我可以将用户分配为管理员,但我目前的问题是我不知道如何“限制访问”,所以它只是“管理员”组。
谢谢
解决方案
我敢肯定还有其他方法可以做到这一点,但这是一条路径:
你有一个你已经展示的get方法。我假设您也有一个 Post 方法来实际发布更改。
您的 get 方法只是为有效的提交帖子设置有用的 UI。它不应该验证更改(在您的 post 方法中执行此操作) 在您的 get 方法中,对于有问题的 case 语句,首先将您的集合设置为它自己的对象。然后检查他们是否是管理员并附加选项然后将其分配给您的视图包:
case SOStatus.Released:
ViewBag.Invoice = true;
var options = new List<Object>{new {value = SOStatus.Shipped, text = "Shipped" }, new {value = SOStatus.Close, text = "Close" }};
if(user is admin)
options.add(new {value=SOStatus.Pending, text = "Pending"});
ViewBag.statusList = options;
break;
在您的发布方法上,您将在修改前重新检查原始状态
如果原始状态 = 已发布且新状态 = 待处理且用户不在管理员组中,那么您将抛出错误的请求响应。
按照此流程,您正在为用户友好的成功帖子设置 UI,但如果用户决定尝试破解表单提交,您可以了解您的业务逻辑。
如果您有大量业务逻辑并且您定期进行这些检查,那么您最好使用 validate 方法围绕 SalesOrder 类编写一个包装器。不过,我不知道您的要求,因此在您的情况下可能会过度设计它。
推荐阅读
- regex - 如何识别不包含特定字符的文件
- c++ - 新的整数数组向右移动?
- machine-learning - 没有任何隐藏层的模型显示出 98% 的准确率。为什么?
- actions-on-google - 为谷歌助手应用程序构建数字交易
- html - 图像上的 HTML 和 CSS Positionong 文本
- javascript - 使用缺少键的对象映射反应数组导致 TypeError 崩溃
- android - 当我在模拟器上启动我的应用程序时,总是有一个旧的 apk
- c++ - 为什么这段代码给我错误?有自我错误吗?
- java - 空着身子奔跑 永远奔跑
- python - 如何从字符串中删除小数点后的零删除点后的所有零