モデルはrails g devise users で作成したものを前提とします。
まず、カスタマイズ用のコントローラを作成します。
app/controllers/users/sessions_controller.rb
とでもしておきます。
次にroutes.rbを編集して、今作成したコントローラをdeviseから利用できるようにします。
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定義の部分だけ以下のように修正します。
class Users::SessionsController < Devise::SessionsController
これで継承できました。
ログイン時の認証を担当しているのはcreateメソッドですので、次はそちらを修正します。
# 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モデルをそのまま扱えば自前のロジックを実装できます。
これを応用してアカウントを作成しないゲストユーザーを認証させたいような場合に使えると思います。