我们正在构建一个使用数据库的 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 是否有更好和不同的方法?