我正在开发基于API的应用程序,site.com(客户端应用程序),api.site.com(服务器应用程序)
在我的api.site.com中,有密码、确认控制器,它们是从设备控制器继承来的。默认情况下,设计父控制器是应用程序控制器,但设计继承的控制器需要通过apibasecontroller api_身份验证操作。因此,designe.rb具有以下配置:

config.parent_controller = 'ApiBaseController'

API身份验证现在工作正常。
ApibaseController示例代码:
class ApiBaseController < ApplicationController
  before_action :api_authentication

  def api_authentication
    api_key = request.headers['Api-Key']
    @app = Application.find_by_api_key(api_key) if api_key
    unless @app
     return render json: { errors: { message: 'Something went wrong, contact admin', code: '1000' } }
    end
  end
end

现在我正在使用active admin,在安装activeadmin之后,我试图在浏览器上打开http://localhost:3000/admin/login,但在浏览器上看到以下错误响应,而不是active admin登录页面:
{"errors":{"message":"Something went wrong, contact admin","code":1000}}
我检查了这个问题,发现active_admin/devise/sessions控制器也通过了apibasecontroller。这是因为我们已经将父控制器设置为apibasecontroller(config.parent_controller = 'ApiBaseController')。我删除了代码,activeadmin运行良好。
但是密码、确认控制器没有通过apibasecontroller api_authentication(),因为我删除了desve配置(config.parent_controller = 'ApiBaseController')。
所以如果你们已经理解了这个问题,请告诉我解决方法。
总之,我需要继承的所有api设计控制器都需要通过apibasecontroller进行api_authentication()检查,而activeadmin设计控制器不需要通过apibasecontroller。
提前谢谢。

最佳答案

您只需在application_controller.rb中编写api身份验证逻辑,并在密码控制器中或任何需要的地方使用before_filter

class ApplicationController < ActionController::Base

 private

 def api_authentication
    api_key = request.headers['Api-Key']
    @app = Application.find_by_api_key(api_key) if api_key
    unless @app
      return render json: { errors: { message: 'Something went wrong, contact admin', code: '1000' } }
    end
  end
 end

在控制器中使用before_filter :api_authentication
class PasswordsController < Devise::PasswordsController
  before_filter :api_authentication

  .......
end

08-16 22:58