3

我们正在构建一个使用数据库的 web 应用程序。我们还使用对象关系映射器来访问数据库。Web 应用程序中授权的一个方面是用户可以访问由 URL 引用的对象。URL 包含数据库中特定记录的唯一 ID(例如主键)。考虑以下示例。

  • 一个用户可能属于许多,一个可能有许多用户(多对多)。
  • 调查属于一个组多对一)。
  • 一项调查可能有多个问题。(多对一)。

假设我们有以下 URL:http://app.local/question/edit/10。这意味着我们要使用 PK 10 编辑问题。现在,我们要验证登录用户是否可以使用 PK 10 访问问题。这可以通过检索此问题来完成,然后是调查,然后是,然后是所有用户。如果任何用户与登录用户相同,则登录用户可以访问该问题

概括一下;我们想检查一条记录是否可以通过已知的多对一或多对多关系从另一条记录到达。因此,如果存在多对一关系(例如调查问题,那么我们应该检查是否可以通过调查然后通过组从问题中访问用户具有多对多关系与用户,所以我们应该检查是否有任何(不是全部)用户与登录用户相同。

如果一个表有多个多对一关系,比如说;我们可以将 CSS模板附加到调查中,并且该模板也属于一个,然后我们必须检查是否可以从所有多对一关系(因此是模板)中访问用户。当然,这同样适用于多个多对多关系。

是否有支持这种行为的对象关系映射器?这种行为叫什么,也许是可达性?Propel (for PHP) 是否支持这种行为?我认为这种可达性可以通过以下两种方式中的任何一种来完成:

  • 执行查询以获取每个“父级”,使用许多查询)
  • 在一个查询中加入所有必要的表以查看是否存在记录(可访问的用户与登录的用户匹配)。

此外,ORM 的这种行为应该支持嵌套集,因此如果一个包含嵌套集行为,它也应该尝试通过该的父级访问用户。

我认为这种行为不应仅限于授权;对象应该只是能够查看它们是否可以到达另一个对象。

请注意,我并不是指可访问性的持久性:http: //jpaobjects.sourceforge.net/m2-site/main/documentation/docbkx/html/user-guide/ch08s03.html

或者......我只是在看这个授权错误吗?ORM 是否有更好和不同的方法?

4

1 回答 1

1

我过去使用 Ruby on Rails 中的嵌套资源(使用 Active Record ORM)处理过这个问题。而不是http://app.local/question/10/edit,URI 将是http://app.local/survey/5/questions/10/edit

在控制器中,您加载问题和调查。您通过将调查与经过身份验证的用户的组成员身份进行比较来检查授权。一种设计方法是将此逻辑嵌入到 User 类中。例如,在控制器中,您拥有questionand survey(ORM 很好地理解了两者之间的关系,即question.survey)。然后,您可以将访问权限检查为user.hasAccess?(question),这将是一种相对容易编写的方法。伪代码:

class User < ActiveRecord::Base

  def hasAccess?(question)
    return question.group.users.include?(self)

是的,这将导致在后台执行多个查询,但 ORM 可以完成这项工作。我这样做是因为您留下了可靠的架构和易于阅读的代码。在您真正遇到性能问题之前不要进行优化。

于 2012-08-06T20:03:25.163 回答