我试图在ruby中创建一个restful的json api --所以我在Rack中使用了grape (https://github.com/intridea/grape)。我没有在这个项目中使用Rails,所以cancan,巫术,等等。似乎不是最好的选择。另外,我不喜欢在grape的声明性DSL中混入一堆命令式逻辑。
虽然grape内置了身份验证支持,但我没有看到任何关于授权的东西。这似乎是一个很常见的用例,这条路以前就已经走过了,但在谷歌和葡萄代码库中进行了相当彻底的挖掘后,我什么也没有找到。
有没有人在他们的grape项目中实现了类似的东西?你用的是什么?
发布于 2015-06-26 11:56:58
这可能有点晚了,但不管怎样。我建议你使用Pundit进行授权,它非常简单。要在您的Grape端点中使用它,您需要包括Pundit助手:
class API < Grape::API
format :json
helpers Pundit
helpers do
def current_user
resource_owner
end
end
mount FoosAPI
end现在,在你的应用程序接口端点中,你应该能够像在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希望它能帮上忙!
发布于 2013-02-22 03:31:48
我想我可以对此给出简短的评论,但是这个字段太短了,如果它不是正确的答案,很抱歉,但是:
你提到了巫术--我认为它是认证系统,与授权无关。(我不知道巫术gem的实现-只是重复文档中的语句,并假设描述列举了它所取代的系统,并且它是有效的定义)。我想这只是个错误。
你应该问自己的基本问题是...
您开发了多少基于角色的系统?我认为,如果这仅仅是公共/私有/管理员角色的问题,那么您可能应该考虑将其转移到不同的API。
在某些情况下,这可能会很麻烦,但对于不复杂的非附加角色来说,值得一试。简单地安装在grape中就可以解决OOTB问题。
真正的问题是,如果你考虑一些可扩展/动态的角色系统,或者你只是想要变得枯燥。这可能是痛苦的;-)。我认为Rayan的Bytes cancan gem实现应该能帮助你理解如何在更高的抽象层次上解决这样的问题。对于特定的(没有更高抽象的--比如动态角色)实现来说,只使用grape中当前给定的helper,并将它们的职责委托给model (基本用法)就可以了。
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)的,我相信这应该在你的模型中完成,并且严格取决于你的需求。
发布于 2014-11-18 00:55:22
我不知道我的回答对你是否及时。我最近在一个Rails4项目中使用Grape和授权时遇到了同样的问题。在尝试之后,我找到了解决这个问题的方法。在我的项目中,我使用了authorization,的pundit,它要求我创建一个策略文件夹,并为每个模型创建授权规则,每个规则都是一个Ruby类,如下所示(来自pundit Github页面)
class PostPolicy < ApplicationPolicy
def update?
user.admin? or not record.published?
end
end然后,在葡萄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 }
endauthenticate!和current_user帮助器是自定义的帮助器。通过这种方式,我可以重用在开发网站部件时创建的授权规则。
这对我很有效。希望专家的方式能为你的葡萄授权解决问题
https://stackoverflow.com/questions/14966210
复制相似问题