首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >{grape}授权

{grape}授权
EN

Stack Overflow用户
提问于 2013-02-20 03:56:07
回答 3查看 4K关注 0票数 12

我试图在ruby中创建一个restful的json api --所以我在Rack中使用了grape (https://github.com/intridea/grape)。我没有在这个项目中使用Rails,所以cancan,巫术,等等。似乎不是最好的选择。另外,我不喜欢在grape的声明性DSL中混入一堆命令式逻辑。

虽然grape内置了身份验证支持,但我没有看到任何关于授权的东西。这似乎是一个很常见的用例,这条路以前就已经走过了,但在谷歌和葡萄代码库中进行了相当彻底的挖掘后,我什么也没有找到。

有没有人在他们的grape项目中实现了类似的东西?你用的是什么?

EN

回答 3

Stack Overflow用户

发布于 2015-06-26 11:56:58

这可能有点晚了,但不管怎样。我建议你使用Pundit进行授权,它非常简单。要在您的Grape端点中使用它,您需要包括Pundit助手:

代码语言:javascript
复制
class API < Grape::API
  format :json

  helpers Pundit
  helpers do
    def current_user
      resource_owner
    end
  end

  mount FoosAPI
end

现在,在你的应用程序接口端点中,你应该能够像在Rails控制器中一样使用authorize foo, action?

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

希望它能帮上忙!

票数 8
EN

Stack Overflow用户

发布于 2013-02-22 03:31:48

我想我可以对此给出简短的评论,但是这个字段太短了,如果它不是正确的答案,很抱歉,但是:

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

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

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

在某些情况下,这可能会很麻烦,但对于不复杂的非附加角色来说,值得一试。简单地安装在grape中就可以解决OOTB问题。

真正的问题是,如果你考虑一些可扩展/动态的角色系统,或者你只是想要变得枯燥。这可能是痛苦的;-)。我认为Rayan的Bytes cancan gem实现应该能帮助你理解如何在更高的抽象层次上解决这样的问题。对于特定的(没有更高抽象的--比如动态角色)实现来说,只使用grape中当前给定的helper,并将它们的职责委托给model (基本用法)就可以了。

代码语言:javascript
复制
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)的,我相信这应该在你的模型中完成,并且严格取决于你的需求。

票数 1
EN

Stack Overflow用户

发布于 2014-11-18 00:55:22

我不知道我的回答对你是否及时。我最近在一个Rails4项目中使用Grape授权时遇到了同样的问题。在尝试之后,我找到了解决这个问题的方法。在我的项目中,我使用了authorization,的pundit,它要求我创建一个策略文件夹,并为每个模型创建授权规则,每个规则都是一个Ruby类,如下所示(来自pundit Github页面)

代码语言:javascript
复制
class PostPolicy < ApplicationPolicy
  def update?
    user.admin? or not record.published?
  end
end

然后,在葡萄API中,我只使用这个类进行授权,代码如下:

代码语言:javascript
复制
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帮助器是自定义的帮助器。通过这种方式,我可以重用在开发网站部件时创建的授权规则。

这对我很有效。希望专家的方式能为你的葡萄授权解决问题

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14966210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档