5

有很多 Rails 插件可以处理用户权限。我对 hobo gem 中的实现印象深刻,但我不确定我是否可以只使用这个功能而不是其他部分。GateKeeper 是一个非常聪明的实现,但有一些错误,虽然它足够小,我可能自己可以修复它。Restful_ACL 为您提供了一个用于检查创建的类方法,这意味着您无法对相关实例进行任何检查(不确定它是否会进行范围查找)。

我想要提供 ActiveRecord#find 的范围版本的东西,它只找到当前用户被允许看到的东西。这应该足够强大,您只能看到您或您的一位朋友拥有的画廊中的图片。

作为奖励,它可以防止您无权执行的创建或更新(在 before_* 或验证步骤中),包括将您自己的记录与不同的用户或画廊相关联,或创建此类记录。

4

4 回答 4

3

您可以使用declarative_authorization插件在模型级别上执行一些非常复杂的授权技巧。尽管如此,我自己更喜欢rails-authorization-plugin - 使用这个你可以定义模型级别的角色(例如,某人是资源的所有者)和控制器级别的权限(例如,只有资源的所有者或管理员可以获取资源)。我发现这种方法更加简洁,特别是如果您正在追求一种干净的 REST 方法。如果您有这样的要求:

GET /posts

您真正应该返回的是所有帖子,而不仅仅是当前用户的帖子。为此,您应该有不同的路线:

GET /users/:user_id/posts

其中 :user_id 设置为当前用户的 ID。然后应该在适当的操作中反映这种差异:

def index
  user = User.find(params[:user_id]) unless params[:user_id].blank?
  @posts =
   if user
    # get all posts of a user
    user.posts.all
   else
    # get all posts 
    Post.all
   end
end

现在,您真正拥有的是两个授权上下文 - “获取用户的所有帖子”和“获取所有帖子”,您通常希望为两者设置不同的权限(例如,“只有管理员可以获取所有帖子”和“仅用户自己或管理员可以获取用户的所有帖子”)。

于 2008-12-08T21:17:24.820 回答
1

我有一个gem,它完全是关于能够根据对象的角色指定对象的权限。你可以看看这里:http: //github.com/nakajima/roleful/tree/master。它适用于before_filter您暗示的那种方法。

至于只允许用户访问与他们有某种关系的事物,我认为您正在寻找 Rails 关联代理的主要候选人。我喜欢 Milan Novota 的片段,尽管我会稍微修改一下:

def index
  @posts = user_repo.posts
end

private

def user_repo
  # find_by_id is **much** faster than regular find,
  # plus it just returns nil when there's no record
  if user = User.find_by_id(params[:user_id])
    # returns the association proxy
    user.posts
  else
    # returns the class
    User
  end
end
于 2009-01-01T19:04:29.333 回答
0

你可以看看lockdown。我还没有在项目中实现这个,但它可以为你节省一些工作。

于 2008-12-08T20:48:14.693 回答
0

回想起来,我只会使用 Hobo 模式。它是最简单和最灵活的。

于 2012-10-10T01:51:51.130 回答