2016-05-31 20 views
2

私はapiベースのアプリケーションsite.com(クライアントアプリケーション)、api.site.com(サーバーアプリケーション)を開発中ですdevise parent_controllerをdevise inherited controllerに使用する方法はありますが、ActiveAdmin devise controllerをスキップしますか?

私のapi.site.comには、パスワード、confirmationsコントローラがあります。コントローラを作成する。デフォルトでは、Devise親コントローラはアプリケーションコントローラですが、Devise継承コントローラはApiBaseController api_authenticationアクションを通過する必要があります。だから、Devise.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 

今私はActiveAdminを使用しています、私はブラウザ上http://localhost:3000/admin/loginを開こうとしたActiveAdminをインストールした後、私が代わりにアクティブな管理者のログインページのブラウザで次のエラー応答を見た:

{"errors":{"message":"Something went wrong, contact admin","code":1000}}

私は問題をチェックし、active_admin/devise/sessionsコントローラもApiBaseControllerを通過したことに気付きました。これは、親コントローラをApiBaseController(config.parent_controller = 'ApiBaseController')に設定したためです。私はコードを削除し、ActiveAdminは正常に機能しました。

しかし、私がDevise設定(config.parent_controller = 'ApiBaseController')を削除したので、パスワード、確認コントローラがApiBaseController api_authentication()を通過しませんでした。

あなたが問題を理解している場合は、私に解決策を教えてください。

要約すると、私はすべてのAPIを必要とするDevise継承されたコントローラは、api_authentication()チェックのためにApiBaseControllerを渡す必要があり、ActiveAdmin DeviseコントローラはApiBaseControllerを渡す必要はありません。

ありがとうございます。

答えて

2

before_filter :api_authenticationを使用し、私は工夫のparent_controller内の条件を追加する方法を探していたが、私は工夫のためのすべてのソリューションを取得できませんでした。しかし、私はいくつかのコードを追加して解決しました。

class ApiBaseController < ApplicationController 
    before_action :api_authentication 

    def api_authentication 
    return true if params[:controller].include?("active_admin/devise/") 
    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 
3

あなたは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 

とあなたのコントローラに

class PasswordsController < Devise::PasswordsController 
    before_filter :api_authentication 

    ....... 
end 
+0

はい、私はApplicationControllerに内部の任意のコードを望んでいない、我々はすでにApiBaseController –

+1

持って、あなたは 'before_action使用することができます場合は、api_authenticationを:?json_request'あなたのAPIベースのコントローラであなたの提案を –

+0

おかげで、私はこれを試みます。ところで、私はそれを解決しました、私はDeviseからの解決を期待していました。私は将来ApiBaseControllerのような多くの親を持つかもしれないからです。 –

関連する問題