일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- javascript
- vscode
- rails
- 자바
- java
- 日本語
- 건담베이스
- 건담
- rails7
- Spring
- メソッド
- C로 시작하는 컴퓨터 프로그래밍4판
- 単語
- 디지몬
- Flutter
- 연습문제
- 一日一つメソッド
- 일본어
- ruby
- 반다이몰
- Web
- Python
- 비즈니스일본어
- html
- 인프런
- springboot
- jsp
- nico
- DART
- CSS
- Today
- Total
AR삽질러
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
'Ruby > RubyOnRails-日本語' 카테고리의 다른 글
Rails 一日一つメソッド (Day11) whereメソッド (0) | 2023.12.31 |
---|---|
Rails 一日一つメソッド (Day10) before_actionメソッド (0) | 2023.12.30 |
Rails 一日一つメソッド (Day08) has_secure_passwordメソッド (0) | 2023.12.28 |
Rails 一日一つメソッド (Day07) updateメソッド (0) | 2023.12.27 |
初めてのRuby on Rails ルーティング、アクション、View, ERB (2) (1) | 2023.12.27 |