{grape}授权

Jos*_*osh 12 ruby api authorization grape-api

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

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

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

fen*_*e87 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
Run Code Online (Sandbox Code Playgroud)

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

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

希望能帮助到你!


Pio*_*ior 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
Run Code Online (Sandbox Code Playgroud)

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