ruby-on-rails – 如何在过滤之前处理Grape中的特定操作?
发布时间:2020-12-17 03:42:39 所属栏目:百科 来源:网络整理
导读:我正在我的Rails项目中安装Grape来构建RESTful API. 现在一些端点有需要身份验证的操作和其他不需要身份验证的端点. 例如,我有用户端点,看起来像: module Backend module V1 class Users Grape::API include Backend::V1::Defaults before { authenticate!
我正在我的Rails项目中安装Grape来构建RESTful API.
现在一些端点有需要身份验证的操作和其他不需要身份验证的端点. 例如,我有用户端点,看起来像: 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,desc: 'User id' requires :display_name,type: String,desc: 'Display name' requires :email,desc: 'Email' end post ':id' do UsersService::Save.new(current_user,params).call end desc "Reset user password" params do requires :old_password,desc: 'old password' requires :password,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 现在您可以看到,除了密码/忘记之外的所有操作都需要用户登录/验证.创建一个新的端点也没有意义,让我们说密码,只是删除密码/忘记那里从逻辑上讲,这个端点应该与用户资源相关. 问题在于Grape之前没有像过滤器这样的选项,只有我可以说应用过滤器来执行某些操作. 你如何以干净的方式处理这种情况? 解决方法
我能想到的一种方法是使用route_setting为你想要绕过auth的路由添加自定义属性.在调用authenticate之前检查before过滤器中的这些属性!像下面这样的东西应该工作:
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,params).call end desc "Forget password" route_setting :auth,disabled: true params do requires :email,params).call end end end end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |