1

ユーザーがログインしたばかりの場合は、JSON 応答にユーザーを含めてauthentication_token、API のコンシューマーがそれを追跡し、将来の要求を認証できるようにしたいと考えています。しかし、そうでなければトークンを含めたくありません。Active Model Serializers を使用して JSON 出力をカスタマイズしています。

class UserSerializer < ActiveModel::Serializer
  attributes :id, :email, :authentication_token

  def include_authentication_token?
    # what to put here?
  end
end

Devise セッション コントローラーはrespond_with resource、resource がログイン ユーザーの場所を使用するため、デフォルトでは UserSerializer を使用します。Devise コントローラーをカスタマイズすることもできましたが、むしろinclude_authentication_token?. ユーザーがログインしたばかりのときに true を返す Devise のメソッドはありますか (つまり、応答が Devise::SessionsController から来ている場合)?

4

2 に答える 2

0

現在の Request が のサブクラス内で自動的に使用可能になるわけではありませんが、 への呼び出しに含めることでシリアライザーActiveModel::Serializerのハッシュに簡単に渡すことができます。optionsUserSerializer.new

次のようにシリアライザを明示的に作成する場合:

UserSerializer.new(@user, scope: current_user)

つまり、次の 2 番目のオプションを単純に渡すことができますrequest

UserSerializer.new(@user, scope: current_user, request: request)

それ以降は、 を呼び出すことで、シリアライザーの現在の Request にアクセスできますoptions[:request]。たとえば、 内の現在のコントローラーを検査するにはUserSerializer、単純に の値を確認します。

options[:request].params[:controller]

のように表示される場合"devise/sessions"は、トークンを含めても問題ありません。それ以外の場合、標準の Devise コントローラーを使用してサインインを処理している場合は、おそらくサインインをサブクラスDevise::SessionsController化し、新しいコントローラーに再ルーティングする必要があります。

# app/controllers/sessions_controller.rb
class SessionsController < Devise::SessionsController
  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, location: after_sign_in_path_for(resource), request: request
  end
end

# config/routes.rb
devise_scope :user do
  post "sign_in" => "sessions#create", as: :user_session
end

私はまだこれをテストしていないことに注意してください。のソースを読むとActionController::MimeResponds#respond_with、 に与えられたオプション#respond_withはレスポンダに下向きに渡されるActionController::Serializationように見えますが、レスポンダは によってハイジャックされ、オプションはのシリアライザにずっと渡されているようです。resource

幸運を!

于 2013-03-19T04:14:48.330 に答える
-1

多分これはあなたを助けるでしょう。

- (ブール値) signed_in?(スコープ = nil)

そしてstackoverflow でカスタムセッションコントローラーにサインインチェックを追加する方法を工夫する

于 2013-03-19T04:15:59.587 に答える