LoginSignup
24
21

More than 5 years have passed since last update.

deviseを改造してパスワードなしでログインできるようにする

Last updated at Posted at 2014-01-23

モデルはrails g devise users で作成したものを前提とします。
まず、カスタマイズ用のコントローラを作成します。
app/controllers/users/sessions_controller.rb
とでもしておきます。
次にroutes.rbを編集して、今作成したコントローラをdeviseから利用できるようにします。

routes.rb
  devise_for :users, :controllers => {
    :sessions => 'users/sessions'
  }

次にdeviseが本来使用しているログイン用のコントローラを継承してオーバーライドしていきます。
https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb
上のclassを先ほど作成したsessions_controller.rbにまるまるコピペして、class定義の部分だけ以下のように修正します。

sessions_controller.rb
class Users::SessionsController < Devise::SessionsController

これで継承できました。
ログイン時の認証を担当しているのはcreateメソッドですので、次はそちらを修正します。

sessions_controller.rb
  # POST /resource/sign_in
  def create
    #元の認証ロジック
    #self.resource = warden.authenticate!(auth_options)

    #emailだけでログインできるように変更
    self.resource = User.where(:username => params[:user]['email']).first

    set_flash_message(:notice, :signed_in) if is_flashing_format?
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, :location => after_sign_in_path_for(resource)
  end

元の認証ロジックで返されるself.resourceの中身をログに出してみるとわかりますが、これはUserモデルのオブジェクトになっています。
従って、Userモデルをそのまま扱えば自前のロジックを実装できます。
これを応用してアカウントを作成しないゲストユーザーを認証させたいような場合に使えると思います。

24
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
21