【问题标题】:How to effectively check user rights on update actions如何有效检查更新操作的用户权限
【发布时间】:2014-06-09 16:45:37
【问题描述】:

我开始编写自己的动作过滤器,我不得不说这个功能非常好。但是我对一个设计问题感到困惑。当我们有 CRUD 动作时,让我们说一个超级市场中的产品,动作方法看起来像这样:

public ActionResult CreateProduct(int ShopID); // Users within specific role for that shop
public ActionResult GetProduct(int ProductID); // Everybody can do
public ActionResult UpdateProduct(int ProductID); // Users within specific role for that shop
public ActionResultat DeleteProduct(int ProductID); //Users within specific role for that shop

我的问题是我在这个应用程序中没有全局角色。这里的角色仅限于特定的上下文:A 店的管理员用户可能不是 B 店的管理员。所以我的问题来了。在我的授权过滤器中,我可以很容易地检查当前用户对 CreateProduct Action 的权限,因为 Shop 的 ID 是在参数中传递的。

对于 GetProduction 操作,问题开始出现,但很容易解决,因为每个人都应该有权访问该操作。但是对于更新和删除操作,由于我不知道产品属于哪个商店,我如何知道当前用户的权限?

好吧,关键是我的过滤器应用于在各种存储库上工作的操作,而不仅仅是产品,所以我不能说“如果操作名称包含单词更新,则在产品存储库中检索相应的商店”。到目前为止,我已经想到了两种解决方案

  1. 检查过滤器中的操作名称并手动处理每个案例。 (对我来说似乎是一个非常糟糕的解决方案)
  2. 将产品 ID 和商店 ID 作为参数传递给我的操作,但我觉得这不是正常的方法。我觉得这样做会引入某种冗余,我不知道这是否是一种常见做法。

要走的路是什么? (请不要告诉我添加 3 层和工厂模式,我是一名初级设计师,上个月我一直在努力获得最先进的设计。现在它相当不错,但我真的可以' t 花更多的时间再次深入改变设计)。

谢谢!

【问题讨论】:

    标签: asp.net-mvc action-filter


    【解决方案1】:

    由于您需要访问数据库中的特定业务实体以检查此访问权限,我认为您不能有效地将其用作操作过滤器。

    您可能需要某种“IsUserInRoleForShop(role, shop)”方法,可以从需要检查它的方法中调用(因为这些似乎只是从您的代码库中选择的。

    您需要查询数据库以获取商店 ID(我想您可能需要这样做才能正确更新模型中的实体)。传递商店 ID 是个坏主意,因为如果没有验证,您就会对有人摆弄帖子以传递他们的商店 ID 和其他人的产品 ID 持开放态度。

    【讨论】:

    • 谢谢,其实我看错了你的回答。我刚刚编辑了该评论。那么没有办法将所有的授权逻辑从控制器中移出?
    • 感谢您提供有关在 URL 中传递 Shop ID 的信息!知道这一点很重要,我没想到。
    • 很难将其全部删除,尤其是当您将根据要访问的内容制定不同的授权规则时。如果运行身份验证的代码很常见,那么至少它不会全部分散在您的代码库中。
    猜你喜欢
    • 2013-12-09
    • 1970-01-01
    • 2019-06-26
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多