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