AR삽질러

Rails 一日一つメソッド (Day09) authenticateメソッド 본문

Ruby/RubyOnRails-日本語

Rails 一日一つメソッド (Day09) authenticateメソッド

아랑팡팡 2023. 12. 29. 21:24
728x90

 

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

 

 

 

728x90
반응형
LIST