🐻

【RubyonRails】sorceryを使ってログイン機能を実装する方法

2024/08/13に公開

はじめに

RubyonRailsでsorceryを使ってログイン機能を実装するまでのチュートリアルを共有します。
具体的には、以下のような内容で進めます。

  1. sorceryのインストール
  2. データベースのマイグレーション
  3. Userモデルの設定
  4. ルーディングの設定
  5. Controllerの作成
  6. Viewの作成

1. sorceryのインストール

Gemfileにsorceryを追加します。

gem 'sorcery'

bundle installでインストールを実行します。

docker-compose exec web bundle install

以下のコマンドで必要なファイルを生成します。

docker-compose exec web bin/rails g sorcery:install

これにより、以下のファイルが生成されます。

  • app/models/user.rb
  • config/initializers/sorcery.rb
  • マイグレーションファイル

2. データベースのマイグレーション

生成されたマイグレーションファイルをデータベースに反映させます。

docker-compose exec web bin/rails db:migrate

3. Userモデルの設定

Userモデルに認証機能を追加します。

class User < ApplicationRecord
  authenticates_with_sorcery!

  # ユーザーが設定したパスワードの長さが3文字以上であることを確認
  validates :password, length: { minimum: 3 }, if: -> { new_record? || changes[:crypted_password] }
  # ユーザーが設定したパスワードと確認用のパスワードが一致していることを確認
  validates :password, confirmation: true, if: -> { new_record? || changes[:crypted_password] }
  # 確認用パスワードの入力が存在することを確認
  validates :password_confirmation, presence: true, if: -> { new_record? || changes[:crypted_password] }

  # 新規にユーザーが登録された際に、emailが存在するか、登録済みかどうかを確認
  validates :email, uniqueness: true, presence: true
end

4. ルーティングの設定

config/routes.rbに以下を追加します。

# /loginにアクセスされた場合、user_sessionsコントローラーのnewアクションを呼び出す
get 'login', to: 'user_sessions#new'
# /loginに対してPOSTリクエストが送信された場合、user_sessionsコントローラーのcreateアクションを呼び出す
post 'login', to: 'user_sessions#create'
# /logoutに対してDELETEリクエストが送信された場合、user_sessionsコントローラーのdestroyアクションを呼び出す
delete 'logout', to: 'user_sessions#destroy'

5. Controllerの作成

user_sessions用のコントローラーを作成します。

docker-compose exec web bin/rails g controller user_sessions

app/controllers/user_sessions_controller.rbを以下のように設定します。

class UserSessionsController < ApplicationController
  def new; end

  def create
    @user = login(params[:email], params[:password])
    if @user
      redirect_to root_path
    else
      render :new, status: :unprocessable_entity
    end
  end

  def destroy
    logout
    redirect_to root_path, status: :see_other
  end
end

6. Viewの作成

ログインフォームをapp/views/user_sessions/new.html.erbに作成します。

<%= form_with url: login_path, local: true do |f| %>
  <div>
    <%= f.label :email %>
    <%= f.text_field :email %>
  </div>
  <div>
    <%= f.label :password %>
    <%= f.password_field :password %>
  </div>
  <div>
    <%= f.submit "ログイン" %>
  </div>
<% end %>

最後に

以上が、RubyonRailsでsorceryを使ってログイン機能を実装するまでのチュートリアルです。

Discussion