【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