【Rails】sorceryについて

はじめに

 sorceryとは、Railsに認証機能の実装を行うためのライブラリです。 同じように認証機能を提供してくれているものとしてdeviseなどが挙げられますが、sorceryの方がよりシンプルで、カスタマイズ性に富んでいるという特徴を持ちます。

sorceryでのログイン機能実装方法

sorceryのログイン機能実装方法を述べていきます。

sorceryをインストール

まず、sorcery(gem)をインストールします。

# Gemfile
gem 'sorcery'
$ bundle install
sorceryの初期設定
$ bundle exec rails g sorcery:install

こちらのsorceryに用意されているコマンドを打つことで最低限必要なファイルが生成されます。

DBに反映

このようなマイグレーションファイルが作成されるとおもいますのでこれをDBに反映させます。

class SorceryCore < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :email,            null: false
      t.string :crypted_password
      t.string :salt

      t.timestamps                null: false
    end

    add_index :users, :email, unique: true
  end
end
$ rails db:migrate
ルーティングの設定

次はルーティングの設定です。

get 'login', to: 'user_sessions#new'
post 'login', to: 'user_sessions#create'
delete 'logout', to: 'user_sessions#destroy'
コントラーラの設定

次は、コントローラの設定です。

class UserSessionsController < ApplicationController
  skip_before_action :require_login

  def new
  end

  def create
    @user = login(params[:email], params[:password])

    if @user
      redirect_back_or_to root_path
    else
      render :new
    end
  end

  def destroy
    logout
    redirect_to root_path
  end
end
ビューの記載

最後にビューを作りましょう。 ログインフォームに関してはモデルと紐づかないので、form_with model: @userのようにする必要はありません。

# app/views/user_sessions/new.html.erb
<%= form_with url: login_path, local: true do |f| %>
  <%= f.label :email %>
  <%= f.email_field :email %>

  <%= f.label :password %>
  <%= f.password_field :password %>

  <%= f.submit "ログイン!!" %>
<% end %>

sorceryによって提供される便利メソッド

logged_in?

ログインしているかの有無で表示を変えたり処理を変えたりととても便利です。

<% if logged_in? %>

<% else %>

<% end %>
login

ログインするためのメソッドです。引数はemailとpasswordをとります。

def create
    @user = login(params[:email], params[:password])
logout

ログアウトするためのメソッドです。

redirect_back_or_to

redirect_back_or_toメソッドは、保存されたURLがある場合そのURLに、ない場合は指定されたURLにリダイレクトします。 例えば、User#editページに行く => 認証が必要 => ログインページに飛ぶ と言った挙動の場合User#editページが保存され、ログイン成功後にUser#editにリダイレクトすることができます。

require_login

ログインを強制します。ログイン画面が必須の画面・コントローラにおいてbefore_action :recuire_loginを書きます。

# app/controllers/application_controller.rb
before_action :require_login

このように書きます。 ログインを必要としないページは、このようにしてログインを回避します。

class UserSessionsController < ApplicationController
  # skip_before_action :require_login, only: [:new, :create]
not_authenticated

ログインしていなかった場合に呼ばれるメソッドがnot_authenticatedです。

  • 『ログインしていなかったらフラッシュメッセージを表示する』
  • 『ログインしていなかったらこのページにリダイレクトをする』

のような処理を書くことが一般的です。

# app/controllers/application_controller.rb
private
def not_authenticated
  redirect_to login_path, alert: "Please login first"
end