【问题标题】:Rails User Access PluginsRails 用户访问插件
【发布时间】:2010-09-25 22:03:12
【问题描述】:

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

我想要一个提供范围版本的 ActiveRecord#find 的东西,它只查找当前用户被允许查看的内容。这应该足以说明,您只能看到画廊中属于您或您的一位朋友的图片。

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

【问题讨论】:

    标签: ruby-on-rails permissions acl access-control


    【解决方案1】:

    您可以使用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
    

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

    【讨论】:

    • 我结合使用 rethful_authentication 和 rails-auth 插件。 Rails Auth 非常强大,并且提供了完整的 DSL 来描述您的权限。
    【解决方案2】:

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

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

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2017-10-16
          • 2011-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-07
          • 2016-12-20
          • 2020-09-07
          • 2016-04-17
          相关资源
          最近更新 更多