ORM:通过可达性进行授权

ORM:通过可达性进行授权,orm,authorization,Orm,Authorization,我们正在构建一个使用数据库的Web应用程序。我们还使用对象关系映射器访问数据库。webapplication中授权的一个方面是用户可以访问URL引用的对象。URL包含数据库中特定记录的唯一id(例如主键)。考虑下面的例子。 一个用户可能属于多个组,一个组可能有多个用户(多对多) 调查属于一个组(多对一) 调查可能有多个问题。(多对一) 假设我们有以下URL:。这意味着我们要用PK 10编辑问题。现在,我们要验证登录用户是否可以使用PK 10访问问题。这可以通过检索这个问题、调查、小组和所有用

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

  • 一个用户可能属于多个组,一个组可能有多个用户(多对多)
  • 调查属于一个组(多对一)
  • 调查可能有多个问题。(多对一)
假设我们有以下URL:。这意味着我们要用PK 10编辑问题。现在,我们要验证登录用户是否可以使用PK 10访问问题。这可以通过检索这个问题、调查、小组和所有用户来实现。如果任何用户与登录用户相同,则登录用户可以访问该问题

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

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

是否存在支持此行为的对象关系映射程序?此行为称为什么,可能是可达性?Propect(对于PHP)是否支持此行为?我认为此可达性可以通过以下两种方式之一实现:

  • 执行查询以获取每个“父项”,使用许多查询)
  • 联接所有必要的表,以查看在一个查询中是否存在记录(可访问用户与登录用户匹配)
此外,ORM的这种行为应该支持嵌套集,因此,如果一个组包含嵌套集行为,它也应该尝试通过该组的父级与用户联系

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

请注意,我不是指可达性的持久性:


或者。。。我只是看错了这种授权吗?ORM是否有更好和不同的方法?

我过去在RubyonRails(使用活动记录ORM)中使用嵌套资源处理过这一问题。而不是,URI将是

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

class User < ActiveRecord::Base

  def hasAccess?(question)
    return question.group.users.include?(self)
class用户
是的,这将导致在幕后进行多个查询,但ORM可以完成这项工作。我这样做是因为您只剩下可靠的模式和易于阅读的代码。在实际出现性能问题之前不要进行优化