如何实现类似 highrise 或 facebook 的权限系统

Posted

技术标签:

【中文标题】如何实现类似 highrise 或 facebook 的权限系统【英文标题】:How to implement a permissions system like highrise or facebook 【发布时间】:2011-01-17 18:58:21 【问题描述】:

嘿,我希望在 highrise 或 facebook 中实现权限系统。

此类问题的问题在于必须在对象实例上定义权限(可见性)。在我的脑海中,我可以想到将 user_ids 或 group_ids 保存在每个记录的哈希中。这是最好的方法吗?

我正在使用 mongodb,这样应该会更容易。虽然我们也可以切换到 sql (highrise 可能会使用 sql)。

编辑:我最终编写了一个与 mongoid 一起使用的 gem,您可以阅读更多关于它的信息 here

【问题讨论】:

【参考方案1】:

@Abhishiv:完成这项任务后,我将实施某种形式的约定来按字段设置访问权限。

给定一个像下面这样的对象:


  name : "me",
  user : "me01234",
  salary : "100",
  address : "123 Nowhere drive"

我会通过执行以下操作来添加权限:


  name : "me",
  user : "me01234",
  salary : "100",
  address : "123 Nowhere drive"
  p_salary : [ 'g/accounting', 'g/management', 'u/owner' ]
  p_address : [ 'g/accounting', 'g/hr', 'u/me' ]

通过这样的约定,您可以维护文档级别的访问权限。而且很容易看出如何编写这样的东西。

现在通常您需要对象和集合本身的访问权限。这使整个过程更加干燥。对于这样的事情,我会简单地构建一个“权限”集合,其中包含数据库中每个其他集合的默认权限。

在我的脑海中,我不知道有任何框架可以“开箱即用”地做到这一点。我会看看 Mongoid 和 MongoMapper,看看这种类型的细节是否不适合插件。

【讨论】:

这似乎是要走的路。这也意味着我们将不得不使用 mongo,因为据我所知,没有办法在 sql 中查询哈希值。或者可能是 sql 和 mongo 的混合。谢谢你的回复。我会考虑把它变成一个 mongoid 的插件。【参考方案2】:

看康康:https://github.com/ryanb/cancan

【讨论】:

感谢您的回复。我以前用过cancan,但它的实现方式不同。我仍然需要一种方法来在数据库中存储有关实例(行/对象)的权限。那时我可以考虑在此之上使用cancan。 – Asaxena 7 秒前编辑 +1 康康舞。也许不适合这里,但它是所有的真棒【参考方案3】:

你试过declarative authorization吗?

【讨论】:

是的,但同样的问题。我需要一种将实例的可见性存储在列中的方法。

以上是关于如何实现类似 highrise 或 facebook 的权限系统的主要内容,如果未能解决你的问题,请参考以下文章

在脸书上张贴大图

如何计算mongodb中子对象(同一文档)的数量[重复]

如何实现功能 i.s.在建立与 SQL 的连接时控制“Incr Pool Size”或“Decr Pool Size”?类似于甲骨文

如何实现类似 Digg 的算法?

如何实现类似facebook的通知?

如何实现类似MacOS(EN Intl)的德国变音符行为?