有很多轨道插件在那里,处理用户的权限。我印象深刻的流浪汉宝石的执行,但我不知道我是否可以只使用此功能,而不是其他部位。网守是一个非常聪明的实现,但是有一些错误,虽然它足够小,我可能要自己解决。 Restful_ACL给你检查创建,这意味着你不能做实例任何检查有问题(不知道,如果它不作用域的发现)一类的方法。

我想的东西,提供的ActiveRecord#查找的范围的版本,只能找到当前事物的用户可以去看看。这应该是足够强大的话,你只能看到那些在您所拥有或您的朋友一个画廊的图片。

作为奖励,它可以防止产生或你没有执行权,包括自己的记录,用不同的用户或画廊关联,或创造这样的记录更新(在before_ *或验证步骤)。

有帮助吗?

解决方案 4

在回想起来,我将只使用流浪汉图案。它是最简单和最灵活的。

其他提示

可以做与 declarative_authorization 插件模型级别一些非常复杂的授权技巧。不过,我自己比较喜欢轨授权 - 插件 - 这一个您定义的模型级的角色(例如,某人是一个资源的所有者),并在控制器级别的权限(例如,仅一个资源或管理员的所有者可以得到的资源)。我发现这种方法更加简洁,特别是如果你正在追求一个干净的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

现在,你真的有这里有两个授权语境 - “获取用户的所有帖子”和“让所有的帖子”和你平时想为这两个设置不同的权限(例如:“只有管理员可以得到所有的职位”。和“仅用户它自或管理员可以得到一个用户的所有文章”)。

我有一个宝石这是完全对能够基于他们的角色对象指定的权限。你可以在这里看看: http://github.com/nakajima/roleful/tree/master 。这将很好的工作排序before_filter办法你暗示。

至于只允许用户访问与他们有某种关系的事情,我认为你正在寻找一个总理候选人的Rails协会代理。我喜欢米兰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

您可以检查出锁定。我还没有实施的项目还没有这样,但它可以为您节省一些工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top