{grape}授权

时间:2013-02-19 19:56:07

标签: ruby api authorization grape-api

我正试图在红宝石中创建一个宁静的json api - 所以我在Rack中使用葡萄(https://github.com/intridea/grape)。 我没有在这个项目中使用Rails,所以cancan,sorcery等......似乎不是最好的选择。另外,我讨厌将一堆命令式逻辑混合到葡萄的声明性DSL中。

虽然葡萄已经内置了身份验证支持,但我没有看到任何有关授权的信息。看起来这将是一个很常见的用例,这条道路之前就已经走过了,但经过谷歌和葡萄代码库本身的一些非常彻底的挖掘之后,我什么都没发现。

有没有人为他们的葡萄项目实施这样的东西?你用了什么?

3 个答案:

答案 0 :(得分:8)

这可能有点太晚了,但无论如何。我建议您使用 Pundit 进行授权,这非常简单。要在 Grape API端点中使用它,您需要包含Pundit帮助程序:

class API < Grape::API
  format :json

  helpers Pundit
  helpers do
    def current_user
      resource_owner
    end
  end

  mount FoosAPI
end

现在,在您的API端点中,您应该能够像在Rails控制器中一样使用authorize foo, action?

class FoosAPI < Grape::API
  get ':id' do
    foo = Foo.find(params[:id])
    authorize foo, :show?
    present foo, with: FooEntity
  end
end

希望它有所帮助!

答案 1 :(得分:1)

我以为我可以对此发表简短的评论,但该领域是短暂的,对不起,如果它不是正确答案但是:

你提到了巫术 - 我认为它是认证系统,与授权无关。 (我不知道巫术宝石的实现 - 只是重复文档中的声明,并假设描述列举了它取代的这类系统,并且它是有效的定义)。我想这只是错误。

你应该问自己的基本问题是......

您开发了多少基于角色的系统?我认为如果这只是公共/私人/管理员角色的问题,你应该考虑将其转移到不同的API。

在某些情况下这可能很麻烦,但值得尝试一下并非复杂的无附加角色。简单的葡萄装就可以解决问题OOTB。

真正的问题是,如果你考虑一些可扩展/动态角色系统,或者你想要只是干。这可能很痛苦;-)。我认为Rayan的Bytes cancan gem实现应该可以帮助您理解如何在更高的抽象层次上解决这样的问题。对于特定的(没有更高的抽象 - 例如动态角色)实现,只需使用来自葡萄的当前给定的帮助者并将其职责委托给模型(基本用法)。

helpers do
  def current_user
    @current_user ||= User.authorize!(env)
  end

  def authenticate!
    error!('401 Unauthorized', 401) unless current_user
  end
end

所以所有的故事都是关于如何实现User.authorize!(env),我相信应该在你的模型中完成并严格依赖于你的需求。

答案 2 :(得分:1)

我不知道我的答案是否适合你。我最近在Rails4项目中遇到了与 Grape 授权相同的问题。经过努力,我发现了一种方法。 在我的项目中,我使用pundit进行授权,它要求我创建策略文件夹,并为每个模型创建授权规则,每个规则都是Ruby类,类似这样(来自pundit Github页面)

class PostPolicy < ApplicationPolicy
  def update?
    user.admin? or not record.published?
  end
end

然后在Grape API中,我只使用此类进行授权,代码如下:

desc "hide a post"
post :hide do
  authenticate!
  error!( "user unauthorized for this" ) unless PostPolicy.new(current_user, @post).hide_post?
  @post.update hidden: true
  { hidden: @post.hidden }
end

authenticate!current_user助手是自定义助手。通过这种方式,我可以重用在开发网站部件时创建的授权规则。

这对我有用。希望 Pundit 方式可以解决您的问题葡萄授权