web-dev-qa-db-ja.com

Deviseで正常にサインインした後、カスタムアクションを実行できますか?

基本的なDevise認証を備えたアプリがあります。サインイン後、ユーザーアカウント(ユーザーbelongs_toアカウント、アカウントhas_many users)を検索し、それをセッションに保存して、@current_userのように使用できるようにします。

このようなフォーメーションでセッションを保存するRails方法は何ですか?サインインが成功した後にコードを実行するためにDeviseで使用できるフックはありますか?

21
vfilby

編集:これはかつては良い解決策でしたが、おそらくこれを処理するためのより良い方法があると考えてください。私は人々に別の選択肢を与え、歴史を保存するためにここに残しているだけです。反対票を投じないでください。

はい、できます。私が最初に見るリソースは http://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in 。また、いくつかのアイデアについては、 Rails devise gem? を使用して正常にサインアップしたときに特定のページにリダイレクトする方法)を確認してください。

次のようなことができます。

def after_sign_in_path_for(resource_or_scope)
  session[:my_account] = current_user.account
  profile_url
end

このメソッドは、ApplicationControllerまたはカスタムRegistrationsControllerに実装できます。

18
Anthony Panozzo

実際、DeviseでOmniauthとデータベースのログインモジュールを組み合わせた場合、受け入れられた回答は正しく機能しません。

Deviseで(ユーザー認証チャネルを無視して)サインインが成功するたびに実行されるネイティブフックは、warden.set_user(devisesign_inヘルパーによって呼び出されます: http: //www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut#sign_in-instance_method )。

ユーザーが正常にサインインした後にカスタムアクションを実行するには(Warden Docs: https://github.com/hassox/warden/wiki/Callbacks )、これを初期化子に入れます(例:after_sign_in.rbinconfig/initializers

Warden::Manager.after_set_user except: :fetch do |user, auth, opts|
  #your custom code
end

更新2015-04-30:@ seanlinsleyの提案(以下のコメントを参照)のおかげで、回答を修正してただし、:: fetchは、ユーザーが認証されたときにのみコールバックをトリガーし、設定されるたびにトリガーするためではありません。

更新2018-12-27Wardenに独自のコードを実行するための組み込みのコールバックがあることを指摘してくれた@thesecretmasterに感謝しますafter_authenticationhttps://github.com/wardencommunity/warden/wiki/Callbacks#after_authentication

34
MatFiz

私はRails 5とデバイス4.2.1を使用しています。私のソリューションはユーザーモデルのデバイス関数をオーバーライドすることです。

def after_database_authentication
    # here's the custom code
end

ユーザーモデルは次のようになります。

class User < ApplicationRecord
    devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable,
        :timeoutable, :lockable
    def after_database_authentication
        # here's the custom code
    end
end

それは認証の直後に呼び出されました、私はこれからそれを読みました ドキュメントを考案する 、これが役立つことを願っています

8
Esgi Dendyanri

次のように、セッションコントローラーのcreateメソッドをオーバーライドすることで、この問題を解決しました。

class Admin::SessionsController < Devise::SessionsController

   def create 
     super
     # here goes my code
     # my settings, etc 
     # do something with current_admin.fullname, for example
  end 
end

つまり、認証が成功した場合(superを呼び出すことにより)、設定を実行します。

4
fade2black

アプリケーションコントローラーでは、アフターアクションを追加するだけです。

app/controllers/users/application_controller.rb

class ApplicationController < ActionController::Base
  after_action :do_something

  def do_something
    # do something
  end
end
0
Yannick Lescure