首页 > 解决方案 > 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; }
    }

我希望管理员能够在它发布时将其切换回待处理状态,但我不希望用户拥有该功能。我有一个组模型,我可以将用户分配为管理员,但我目前的问题是我不知道如何“限制访问”,所以它只是“管理员”组。

谢谢

标签: c#asp.net-mvc

解决方案


我敢肯定还有其他方法可以做到这一点,但这是一条路径:

你有一个你已经展示的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 类编写一个包装器。不过,我不知道您的要求,因此在您的情况下可能会过度设计它。


推荐阅读