【问题标题】:MVC Restrict access to AdminsMVC 限制对管理员的访问
【发布时间】:2020-02-04 19:25:34
【问题描述】:

您好,目前我正在尝试在我的网站上创建一项功能,让管理员可以看到一件事,而普通用户可以看到另一件事。这是我的代码

 [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; }
    }

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

谢谢

【问题讨论】:

  • 您的组模型是否有方法来检查用户是否在管理员组中?
  • 是的,我现在唯一的问题是我不知道如何将其限制为“管理员”组@TravisActon

标签: c# asp.net-mvc


【解决方案1】:

我确信还有其他方法可以做到这一点,但这是一种方法:

您已经展示了一个 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,但如果用户决定尝试破解表单提交,您可以了解您的业务逻辑。

如果您有大量的业务逻辑并且您定期进行这些检查,那么您最好使用验证方法围绕您的 SalesOrder 类编写一个包装器。不过,我不知道您的要求,因此在您的情况下可能会过度设计它。

【讨论】:

  • 非常感谢特拉维斯! (user = admin) 的正确语法是什么?我似乎无法找出正确的检查方法。我是新手,所以我为我的无知道歉
  • @chris 不,这不是正确的语法,这只是解释您所说的管理员权限检查方法。如果您发布,那么我们可以提供进一步的帮助。
  • 抱歉,我意识到我误解了您最初的评论。我还没有任何东西可以检查用户是否是管理员。但是“Admins”的组 ID 1 所以我只是想做一些事情,比如如果用户组 id = 1 然后授予访问权限。但显然不是最好的方法。我已经更新了最初的问题。谢谢!
  • @chris 在您的组模型的上下文中:用户如何与组关联?
  • 通过“userAccess”类。我也加进去
【解决方案2】:

我没有时间获得完整的答案,但请尝试以下方法之一:

检查当前用户: ((RolePrincipal)Usr).GetRoles() 和组(有一个用于身份验证的小会话)。然后你可以切换或重定向,比方说, http重定向 要么 if (rol='ADMIN') return ChangeStatus_Admin(…); 否则返回 ChangeStatus_Others(…);

祝你好运!

【讨论】:

    猜你喜欢
    • 2018-11-21
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2019-08-11
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多