何时何地实施ACL

时间:2009-07-07 06:10:11

标签: ruby-on-rails ruby authorization acl

我已经rails_authorization_plugin启动并运行模型。

在我的网站上实施权限检查的最佳方式是什么?

我有一个复杂的条件,当一个对象的实例应该是可见的时候,是否有一种有效的方法将它们链接在一起所以我不会获取多组数据并且因为将返回的数据循环到我的数据库而磨损我的数据库过滤它?

1 个答案:

答案 0 :(得分:1)

有一种有效的方法:确保只运行一个查询,并且您运行的查询将返回您想要的对象。当然,说起来容易做起来难。

处理此问题的一种方法是使用范围构建条件。

@posts = @thread.posts.not_deleted.this_week.not_secret

如果所有这些方法都是范围,那将只是一个查询。

如果你的条件过于复杂而不能轻易地使它们成为范围,你应该只编写一个方法来为用户返回可见对象。

class User
def posts_for(thread)
  if is_admin?
    thread.posts
  elsif thread.owner == self
    thread.posts.not_deleted
  else
    Post.find(:all, :conditions => something_complicated(thread, self))
  end
end
end

我的应用程序有很多种对象和非常复杂的权限,因此我们使用method_missing捕获类似的调用,并将它们路由到知道如何进行所有各种查询的权限库。