2

我的数据库如下所示:

[表格] 用户资料

  • 用户名

[表格] 类别

  • 类别 ID (PK)
  • UserName(链接到 UserProfile - 这是记录所有者)
  • ProductID(FK 到 Product Table 相关记录)

[表]产品

  • 产品 ID (PK)
  • CategoryId(导航属性)

登录用户只能编辑他们拥有的类别和产品。我很高兴根据控制器从视图中收到的 User.Identity.Name 和 CategoryID 查找 Category,如果我没有得到记录,那么它不存在或用户不拥有它。我开始认为这不是最好的方法,但它确实有效......

我的问题与处理此类产品检查的最佳方式有关?

  1. 我是否应该有一个使用 ProductId 的导航属性来获取UserName值的查询?
  2. 这应该通过控制器中的 linq 查询还是 Products 类的方法来完成?IEprod.ConfirmOwnerIs(User.Identity.Name)
  3. 这应该是一个外部帮助方法Helpers.ConfirmUserCanEditObject(prod, User.Identity.Name)吗?

这个例子稍微简化了,我的真实数据模型有好几层。这对我来说是一个学习项目,所以我试图避免做一些不必要或以低效方式影响数据库的事情,或者成为维护和测试的野兽。我希望在这里得到一些指导和智慧。谢谢。

4

2 回答 2

3

这种类型的检查是一个横切关注点,在我看来,最好在 ActionFilter 中实现。

于 2013-04-29T00:45:36.337 回答
1

如果您需要良好的安全性,我会让对象和控制器都这样做 - 对象只是抛出一个致命异常,而控制器应该确保用户界面不允许用户进入异常会发生的情况被抛出。

基本上,好的安全性需要简单,应该是两个语句“我们有xxx权限吗?” 和“现在就死”。

由于这对用户不够友好,因此您还可以将复杂的控制器代码放入其中以很好地处理事情,但这不应被视为您的安全系统的一部分。

于 2013-04-29T00:57:17.183 回答