我正在开发基于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