sorceryを使ったユーザー機能の作成(ログイン編 )

ログインの実装のためにまず

rails g controller UserSessinos new create destroy

でUserSessionsコントローラを作成して、ログイン画面を表示するためのnew、ログイン機構の実装を担うcreate、ロウアウト機能の実装を担うdestroyアクションを生成するそしたら、app/controllers/user_sessions_controller.rbに以下を記述する

class UserSessionsController < 
ApplicationController
  skip_before_action :require_login, only: %i[new create]
  def new; end

  def create
    @user = login(params[:email], params[:password])
    if @user
      redirect_back_or_to root_path
    else
      flash.now[:alert] = 'Login failed'
      render 'new'
    end
  end

  def destroy
    logout
    redirect_to root_path
  end
end

createアクションではloginメソッドで、認証処理が行われている。emailによるUser検索、パスワードの検証(authenticate)を行い、正常に処理できるとセッションデータにUserレコードのid値を格納する、という処理が行われている。destroyアクションのlogoutメソッドでは、セッションをリセットしている、つまりlogin、logoutメソッドはrails-tutorial8章で書いた

module SessionsHelper

  # 渡されたユーザーでログインする
  def log_in(user)
    session[:user_id] = user.id
  end
  .
  .
  .
  # 現在のユーザーをログアウトする
  def log_out
    session.delete(:user_id)
    @current_user = nil
  end
end

のようなヘルパーにログイン、ログアウトのメソッドを自分で定義していたのをsorceryが用意していくれている。skip-before_actionメソッドではログイン画面の表示(new)、ログイン(create)アクションを実行する場合はrequire_loginメソッドをスキップするように指定
次にapp/controllers/application_controller.rbに以下を追加

class ApplicationController < ActionController::Base
  before_action :require_login

  private

  def not_authenticated
    redirect_to login_path
  end
end

before_actionメソッドによってアクションが実行される前にrequire_loginメソッドを実行して、ログインを要求している、この時ログインできなかった場合にnot_authenticatedメソッドが実行されるようになっている
次にルーティング設定は以下route.rbに以下を追加

get '/login', to: 'user_sessions#new'
post '/login', to: 'user_sessions#create'
delete '/logout', to: 'user_sessions#destroy'

これによってURLヘルパーメソッド、GET login_path,POST /login_path,DELETE logout_pathが 使えるようになる
最後にログインフォームを

<div class="container">
  <div class="row">
    <div class=" col-md-10 offset-md-1 col-lg-8 offset-lg-2">
      <h1>ログイン</h1>
      <%= form_with url: login_path, method: :post, local: true do |form| %>
        <div class="form-group">
          <%= form.label :email %>
          <%= form.text_field :email, class: "form-control" %>
        </div>
        <div class="form-group">
          <%= form.label :password %>
          <%= form.password_field :password, class: "form-control" %>
        </div>
        <div class="actions">
          <%= form.submit "ログイン",class: "btn btn-primary" %>
        </div>
      <% end %>
      <div class='text-center'>
        <%= link_to '登録ページへ',new_user_path %>
        <a href="#">パスワードをお忘れの方はこちら</a>
      </div>
    </div>
  </div>
</div>

のように記述してログイン機能の完成!!

参考文献

Simple Password Authentication · Sorcery/sorcery Wiki · GitHub

【Rails】sorceryのログイン機能を実装 - Qiita