Rails 一日一つメソッド (Day09) authenticateメソッド
Rails 一日一つメソッド (Day09) authenticateメソッド
authenticateメソッド
- has_secure_passwordメソッドと一緒に使われるActiveRecordメソッドで、ユーザー認証、Loginでユーザーが入力したPasswordと保存されているPasswordと一致することを確認する。
has_secure_passwordとauthenticateメソッド
has_secutre_password | authenticate |
ModelにPasswordを暗号化、Passwordフィールドの有効性、認証機能を提供する。 | has_secure_passwordnによって提供される。ユーザーが平文のPasswordと比較しする。 |
bcrypt gemを使ってPasswordを暗号化し、password_digestフィールドに保存する。 | 一致する場合ユーザーオブジェクトを返し、 一致しない場合falseを返す。 |
authenticateメソッド動作方法
1) Password保存
- bcryptで入力されたPasswordを password_diget フィールドに保存する。
2) ユーザー認証
- ユーザーがPasswordを入力すると、authenticateメソッドで入力されたPasswordを暗号化し password_digestに保存されているPasswordと比較する。
3) リターン
- 一致する場合 : オブジェクト
- 一致しない場合 : false
authenticateメソッド例題
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
# ユーザーログイン後にユーザー情報のページにリダイレクトする
else
# エラーメッセージを作成する
render 'new'
end
end
def destroy
end
end
ユーザー | パスワード | a && b |
存在しない | 何でもない | (nil && [anything]) == false |
有効なユーザー | 誤ったパスワード | (true && false_ == false |
有効なユーザー | 正しいパスワード | (true && true) == true |
login : loginPage -> sessionController_create authenticate -> userController_user_show
logout : sessionController_destroy -> root_path
LoginView
new.html.erb
<!-- app/views/sessions/new.html.erb -->
<h1>Login</h1>
<%= form_with(url: login_path, scope: :session, local: true) do |form| %>
<%= form.label :email %>
<%= form.text_field :email %>
<%= form.label :password %>
<%= form.password_field :password %>
<%= form.submit "Login" %>
<% end %>
form_with : helperはloginデータを送るformを生成する
login_path : formを送るurlを指定する。
local: true : Ajaxを使わずHTTPリクエストで設定してする。
Login Controller
SessionController_create
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user&.authenticate(params[:session][:password])
# 로그인 성공
session[:user_id] = user.id
redirect_to user_path(user), notice: 'ログインしました。'
else
# 로그인 실패
flash.now[:alert] = '無効なメール/パスワードの組み合わせです。'
render 'new'
end
end
end
create : 提出されたデータを受け、ユーザーを認識する。
User.find_by : Databaseからユーザーを探す。
user&.authenticate(params[:session][:password]) : 有効なデータかを確認する。
Login Helper
application_controller.rb
class ApplicationController < ActionController::Base
helper_method :current_user, :logged_in?
def current_user
@current_user || User.find_by(id: session[:user_id])
end
def logged_in?
current_user.present?
end
end
current_user : 現在のユーザーを返す。
logged_id? : ユーザーがログインしたかどうかを返す。
routes.rb
Rails.application.routes.draw do
# 로그인
get 'login', to: 'sessions#new'
post 'login', to: 'sessions#create'
end
LogoutView
user_show.html.erb
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user&.authenticate(params[:session][:password])
# 로그인 성공
session[:user_id] = user.id
redirect_to user_path(user), notice: 'ログインしました。'
else
# 로그인 실패
flash.now[:alert] = '無効なメール/パスワードの組み合わせです。'
render 'new'
end
end
def destroy
session.delete(:user_id)
redirect_to root_path, notice: 'ログアウトしました。'
end
end
LogoutController
SessionController.rb
class SessionsController < ApplicationController
def destroy
session.delete(:user_id)
redirect_to root_path, notice: 'ログアウトしました。'
end
end
LogoutHelper
application_controller.rb
class ApplicationController < ActionController::Base
helper_method :current_user, :logged_in?
def current_user
@current_user || User.find_by(id: session[:user_id])
end
def logged_in?
current_user.present?
end
end
routes.rb
Rails.application.routes.draw do
# 로그아웃
delete 'logout', to: 'sessions#destroy'
get 'logout', to: 'sessions#destroy'
end
LogoutView
user_show.html.erb
<!-- app/views/users/user_show.html.erb -->
<h1>User 情報</h1>
<% if flash[:notice] %>
<p class="notice"><%= flash[:notice] %></p>
<% end %>
<p>
<strong>ID:</strong>
<%= @user.id %>
</p>
<p>
<strong>Name:</strong>
<%= @user.name %>
</p>
<p>
<strong>Email:</strong>
<%= @user.email %>
</p>
<%= link_to 'ログアウト', logout_path, method: :delete %>
https://github.com/designAR/rails_method_study/tree/day09_authenticate
GitHub - designAR/rails_method_study
Contribute to designAR/rails_method_study development by creating an account on GitHub.
github.com