如何有效地检查更新操作的用户权限

时间:2014-06-09 08:36:47

标签: asp.net-mvc action-filter

我开始编写自己的Action Filters,我不得不说这个功能非常好。但是我对设计问题感到困惑。当我们有CRUD操作让我们在supermaket中说出一个产品时,Action Methods看起来像这样:

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 Action,问题开始出现,但它非常容易管理,因为每个人都应该有权访问该Action。但是,对于更新和删除操作,我如何知道当前用户的权利,因为我不知道该产品属于哪个商店?

嗯,重点是我的过滤器应用于处理各种存储库的操作,不仅仅是产品,所以我不能说"如果操作名称包含单词Update,请检索相应的商店产品库"。到目前为止,我已经想到了两个解决方案

  1. 检查我的过滤器中的操作名称并手动处理每个案例。 (看起来对我来说是一个非常糟糕的解决方案)
  2. 将产品ID和商店ID作为参数传递给我的操作,但我不觉得这是正常的方法。我觉得我会通过这样做来引入某种冗余,而且我不知道这是否是一种常见做法。
  3. 要走的路是什么? (请不要告诉我添加3层和工厂模式,我是初级设计师,我上个月花了很多时间试图获得最先进的设计。现在它&#39 ;相当不错,但我真的不能花更多的时间来重新改变设计。

    谢谢!

1 个答案:

答案 0 :(得分:2)

由于您需要从数据库访问特定的业务实体以检查此访问权限,因此我认为您无法有效地将其作为操作过滤器执行。

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

您需要查询数据库以获取商店ID(我想您无论如何都可能需要这样做才能正确更新模型中的实体)。传递商店ID是一个坏主意,因为没有验证,你可以向那些摆弄帖子的人传递他们的商店ID以及其他人的产品ID。