ログイン機能に必要なもの
・ログインページ(コントローラ生成)
・アクセス制限するページ(コントローラ生成)
-> もしくはログイン時と未ログイン時を切り替えるページ
・ログインデータモデル(例:User)
ログイン処理の流れ
ログイン処理の実装準備
・ページの作成
ログイン作業を行うページとアクセスを制限するページを作成します。
$ rails g controller login auth logout $ rails g controller home index
・モデル作成
ログインした人としてない人を判断するためにユーザ情報を管理するモデルを作成します。
$ rails g model User email password
ログイン処理の実装
・ログインデータモデル
ログインページのフォームから送られてきたメールアドレスとパスワードを受け取って、データがあればデータを送り返す。
app/models/user.rb
class User < ActiveRecord::Base def self.authenticate(email,password) user = find_by(email: email) if user != nil && user.password == Digest::SHA1.hexdigest(user.salt + password) then user else return end end end
・ログインページ
ログインページにメールアドレスとパスワードの入力フォームを付ける。@errorはエラーメッセージ。form_tagでフォームを生成、フィールドはメールアドレスとパスワードのテキスト入力、最後にログイン(送信)ボタンを配置。
app/views/login/index.html.erb
<p class="error"> <%= @error %> </p> <%= form_tag action: :auth do %> <div class="field"> <%= label_tag :email, 'メールアドレス' %><br /> <%= text_field_tag :email, '', size: 40 %> </div> <div class="field"> <%= label_tag :password, 'パスワード' %><br /> <%= password_field_tag :password, '', size: 40 %> </div> <%= hidden_field_tag :referer, flash[:referer] %> <%= submit_tag 'ログイン' %> <% end %>
・ログイン処理
authはログインページでメールアドレスとパスワードを入力してログインを実行したときの処理。logoutはログアウトするときの処理。セッションを切ることでログイン情報を破棄してログインしていない状態にする。
app/controllers/login_controller.rb
class LoginController < ApplicationController skip_before_action :check_logined def auth user = User.authenticate(params[:email], params[:password]) if user then reset_session session[:user] = user.id redirect_to params[:referer] else flash.now[:referer] = params[:referer] @error = 'メールアドレス/パスワードが間違っています。' render 'index' end end def logout reset_session redirect_to '/' end end
・ログインを要求するページ
app/controllers/home_controller.rb
class HomeController < ApplicationController # ログインチェックのアクションを紐づける before_action :check_logined, only: :index def index end private def check_logined if session[:user] then begin @user = User.find(session[:user]) rescue ActiveRecord::RecordNotFound reset_session end end unless @user flash[:referer] = request.fullpath redirect_to controller: :login, action: :index end end end
Userデータを作成してあればログインを試すことができます。