Ruby on Rails 6の認証(ログイン,サインアップ)


かなり多くの任意のアプリケーションでは、制限する必要があるいくつかの部分が含まれます.
多分、あなたはブロックするか、多分あなたがちょうどあなたのサイトとポストアイテムにログインすることができることを確認したい特定のページを持っています.
それが何であれ、あなたのウェブサイトやアプリケーションがログインしてログアウトする機能を持っていることを確認することは不可欠です.
良いニュースは、Rails 6上のRubyでの認証は非常に簡単に実装することです.あなたはこれを持っていると時間がない実行します.
Rails 6で認証を開始する
あなたがする必要がある最初のことは、ユーザーモデルを持っていることを確認します.移動先を移動し、ユーザーテーブルを追加して、あなたの移動を実行して、アプリケーションにユーザーモデルを追加してください.移行中にユーザーモデルを設定すると、「PasswordHand digest」という列があることを確認し、型文字列です.
class AddPasswordDigestToUsers < ActiveRecord::Migration[6.1]
  def change
      add_column :users, :password_digest, :string
  end
end
上記のイメージでは、すでにユーザーテーブルが作成されていますので、PasswordHardダイジェスト列を追加するだけでいいのです.
認証のためのbcrypt gemの使用
あなたの宝石ファイルには、「bcrypt」と呼ばれる宝石があるべきです.先に進んで、その宝石を外したり、宝石ファイルに追加してください.
gem 'bcrypt', '~> 3.1.7'
我々は、Bcrypt宝石の具体的な方法で取得するつもりはないとどのようにこれは暗号化に関する記事ではないので動作します.ただ、この宝石は私たちの認証システムに何が起こっている知っている.
ユーザーモデル( user . rb )に移動し、メソッドHasther SecureRageパスワードを追加します.これをbcrypt gemから取得します.ユーザーモデルに妥当性検査やその他のコードがない場合、次のようになります.
class User < ApplicationRecord
  has_secure_password
end

認証ルート
次に、我々は我々のコントローラでユーザとセッションをつくることができるように、我々のルートをセットアップする必要があります.
ここでいくつかのルートを加えます.コードをリストしてから説明します.
get "signup", to: "users#new"
get "login", to: "sessions#new"
post "login", to: "sessions#create"
delete "logout", to: "sessions#destroy"
resources :users, except: [:new]
認証を使用すると、SessionShellコントローラとUSSSUSEコントローラの両方とも動作します.上記のセッションパスは、おそらくあなたのアプリケーションで作成した他のCRUDアクションに非常に似ています-新しい、作成、および破壊している.
下部には、ルートを生成するためのリソースがあります.我々は除外:新しいので、私たちのサインアップページ/サインアップ/ユーザー/新しい.
ユーザフォームとユーザコントローラ
これらはあなたのアプリケーション内の他のモデルに似ています.ユーザを作成するフォームは次のようになります.
<%= form_with(model: @user, local: true) do |f| %>

<div class="form-group">
  <%= f.label :username %><br/>
  <%= f.text_field :username, class: "form-control" %>
</div>

<div class="form-group">
  <%= f.label :email %><br/>
  <%= f.email_field :email, class: "form-control" %>
</div>

<div class="form-group">
  <%= f.label :password %><br/>
  <%= f.password_field :password, class: "form-control" %>
</div>

<div class="form-group">
  <%= f.submit %>
</div>

<% end %>
このフィールドを使用しているという事実を除いては、何も一般的には見えないはずです.以前に使用されたHASHUNE SecureRoundパスワードメソッドは、ユーザーモデルを仮想メソッドユーザーに与えます.パスワード.
ところで、このフォームはビュー/ユーザー/新しいです.HTML .erb.
USERSUSEコントローラでは、他のモデルと同じように行います.新しいメソッドを作成し、メソッドを作成します.
新しいメソッドで@ userを初期化することは、ユーザーの投稿が受け入れられない場合、フォームをレンダリングするときにエラーで動作するようになります.ここでは、関連するコードを作成します.
def new
   @user = User.new
 end

 def create
   @user = User.new(user_params)
   if @user.save
     flash[:notice] = "User created."
     redirect_to root_path
   else
     render 'new'
   end
 end

private

 def user_params
   params.require(:user).permit(:username, :email, :password)

end
すごい!私たちは今、ユーザを作成することができます、認証の最初のステップレールで.さあ、いいものにしましょう.
ログ、フォーム、セッション、およびSessionShellコントローラ
ログインするフォームを作成しましょう.これは、ビュー/セッション/新に行く予定です.HTML .erb.
<%= form_with(scope: :session, url: login_path) do |f| %>

<div class="form-group">
  <%= f.label :email %><br/>
  <%= f.email_field :email, class: "form-control" %>
</div>

<div class="form-group">
  <%= f.label :password %><br/>
  <%= f.password_field :password, class: "form-control" %>
</div>

<div class="form-group">
  <%= f.submit "Log in", class: "btn btn-primary" %>
</div>

<% end %>
これは、新しいユーザーフォームに非常に似ています.ここでは、私たちは、ユーザーを見つけることができますし、ログインに使用するパスワードに対してパスワードを取得するパスワードを取得するメールアドレスを取得している.
スコープ::Session , URL : LoginHeightパスを使用していることに注意してください.
コントローラを作成し、次のコードを実行します.何をするか説明します.
def create
  user = User.find_by(email: params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    session[:user_id] = user.id
    flash[:notice] = "Logged in successfully."
    redirect_to user
  else
    flash.now[:alert] = "There was something wrong with your login details."
    render 'new'
  end
end

def destroy
  session[:user_id] = nil
  flash[:notice] = "You have been logged out."
  redirect_to root_path
end
まず、フォームでログインしたメールでユーザーを探しています.必要に応じてユーザー名のような何かを使用することを選択することができます-私はちょうど電子メールで行った.
次に、そのユーザが存在し、パスワードが正しいかどうかを確認します.ユーザ.認証メソッドはフォームで送信されたパスワードを受け取ります.次に、データベース内のハッシュされたパスワードに対してこのメソッドをチェックします.パスワードが正しい場合、ユーザーが返されます.
その後、セッション[:]を使用してセッション変数を設定します.その後、アプリケーションでは、セッション[[:ユーザー] ID ]がNILに等しくないかどうかを調べます.それがそうでないならば、それはユーザーがログインされることを意味します.
Destroyメソッドはユーザーをログ出力します.見ることができるように、私たちはちょうどセッション[ UserRound - ID ]をログオンして、ログアウトします.
今、ルートを保護するために、あなたがしなければならないすべては、このようなものです.
if session[:id] #means the user is logged in
  # allow the user to do cool stuff
else
  redirect_to login_path
end
ユーザーがログインしているかどうかを知る必要があるので、アプリケーションのコントローラに特別なヘルパーメソッドを設定します.rbファイル.
helper_method :current_user, :logged_in?
def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

def logged_in?
  !!current_user
end

def require_user
  if !logged_in?
    flash[:alert] = "You must be logged in to perform that action."
    redirect_to login_path
  end
end
これらのメソッドは、以下のようなものをチェックするために、コントローラとビューで使用されます.
if logged_in?
  link to logout path
else
  link to login path
end
And
<h1>Welcome <%=current_user.username %> </h1>
Web開発の詳細については、確認してください.