加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读