【发布时间】: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 操作,问题开始出现,但很容易解决,因为每个人都应该有权访问该操作。但是对于更新和删除操作,由于我不知道产品属于哪个商店,我如何知道当前用户的权限?
好吧,关键是我的过滤器应用于在各种存储库上工作的操作,而不仅仅是产品,所以我不能说“如果操作名称包含单词更新,则在产品存储库中检索相应的商店”。到目前为止,我已经想到了两种解决方案
- 检查过滤器中的操作名称并手动处理每个案例。 (对我来说似乎是一个非常糟糕的解决方案)
- 将产品 ID 和商店 ID 作为参数传递给我的操作,但我觉得这不是正常的方法。我觉得这样做会引入某种冗余,我不知道这是否是一种常见做法。
要走的路是什么? (请不要告诉我添加 3 层和工厂模式,我是一名初级设计师,上个月我一直在努力获得最先进的设计。现在它相当不错,但我真的可以' t 花更多的时间再次深入改变设计)。
谢谢!
【问题讨论】: