gpt4 book ai didi

ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前?

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:38 26 4
gpt4 key购买 nike

我正在我的 Rails 项目中安装 Grape 以构建 RESTful API。

现在一些端点的操作需要身份验证,而另一些则不需要身份验证。

例如,我有 users 端点,看起来像这样:

module Backend
module V1
class Users < Grape::API
include Backend::V1::Defaults

before { authenticate! }

resource :users do

desc "Return a user"
params do
requires :id, type: Integer, desc: 'User id'
end
get ':id' do
UsersService::Fetch.new(current_user,params).call
end

desc "Update a user"
params do
requires :id, type: Integer, desc: 'User id'
requires :display_name, type: String, desc: 'Display name'
requires :email, type: String, desc: 'Email'
end
post ':id' do
UsersService::Save.new(current_user,params).call
end

desc "Reset user password"
params do
requires :old_password, type: String, desc: 'old password'
requires :password, type: String, desc: 'new password'
end
post 'password/reset' do
PasswordService::Reset.new(current_user,params).call
end

desc "Forget password"
params do
requires :email, type: String
end
post 'password/forget' do
PasswordService::Forget.new(current_user,params).call
end

end
end
end
end

现在如您所见,除了password/forget 之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如 passwords 并且只是删除 password/forget 从逻辑上讲,这个端点应该与用户资源。

问题是 Grape before 过滤器没有像 except, only 这样的选项,我可以在其中说对某些操作应用过滤器。

您通常如何干净利落地处理这种情况?

最佳答案

我能想到的一种方法是使用 route_setting 为您想要绕过身份验证的路由添加自定义属性。在调用 authenticate! 之前检查前过滤器中的这些属性。像下面这样的东西应该可以工作:

module Backend
module V1
class Users < Grape::API
include Backend::V1::Defaults

before { authenticate! unless route.settings[:auth] && route.settings[:auth][:disabled] }

resource :users do

desc "Return a user"
params do
requires :id, type: Integer, desc: 'User id'
end
get ':id' do
UsersService::Fetch.new(current_user,params).call
end

desc "Update a user"
params do
requires :id, type: Integer, desc: 'User id'
requires :display_name, type: String, desc: 'Display name'
requires :email, type: String, desc: 'Email'
end
post ':id' do
UsersService::Save.new(current_user,params).call
end

desc "Reset user password"
params do
requires :old_password, type: String, desc: 'old password'
requires :password, type: String, desc: 'new password'
end
post 'password/reset' do
PasswordService::Reset.new(current_user,params).call
end

desc "Forget password"
route_setting :auth, disabled: true
params do
requires :email, type: String
end
post 'password/forget' do
PasswordService::Forget.new(current_user,params).call
end

end
end
end
end

关于ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40088637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com