Contents
実装イメージ図
手順①サインアップ機能を実装する
BCryptのgemをインストール
BCryptとは、パスワードをハッシュ化するための関数を提供するgemで、Railsアプリケーションを作成した時にGemfileにコメントアウトされた状態で記述されている。このコメントアウトを外してインストールすることで、2つのメソッドを使うことができるようになる
①has_secure_passwordメソッド
・セキュアにハッシュ化した不可逆なパスワードを、データベース内のpassword_digestの属性に保存できるようになる。
・passwordとpassword_confirmationを使えるようになる。(これらはDBではなく、メモリに保存される)
※注意※
userモデル内にpassword_digest属性(カラム)を追加していること
②authenticateメソッド
・引数の文字列がパスワードと一致するとそれに紐づくUserオブジェクトを、一致しなければfalseを返すメソッド。
Userモデルとテーブルを作成
1 2 3 4 5 6 7 8 9 10 11 |
class CreateUsers < ActiveRecord::Migration[5.2] def change create_table :users do |t| t.string :username, null: false t.string :email, null: false t.string :password_digest t.timestamps end end end |
1 2 3 4 5 6 7 8 9 10 11 |
class User < ApplicationRecord before_save { self.email = email.downcase } #DB保存前に小文字に変換 validates :username,presence: true validates :email, presence: true, uniqueness: { case_sensitive: false }, #大文字・小文字の区別なし format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i } #「/i」は大文字・小文字を区別せずにマッチングさせる正規表現 has_secure_password end |
Emailのバリデーションについて
コラム:なぜパスワードを平文でDBに保存してはいけないのか?
なぜ、has_secure_passwordメソッドを使って、セキュアにハッシュ化した不可逆なパスワードを、データベース内のpassword_digestの属性に保存させる必要があるのか?
逆に言うと、なぜパスワードを平文でDBに保存していけないのか?
理由は大きく2点
②外部からの不正アクセスにより、万が一情報漏洩があった際に、ユーザー名とパスワードが一緒に漏洩することで二次被害も招くリスクが高くから
①漏洩したユーザー名とパスワードを使って、そのWebサービスに不正ログインされることによる二次被害。例えば、Dropboxのようなサービスだったら、そこに保存してあるデータが全て第三者の手に渡ってしまう恐れがある。
https://www.atmarkit.co.jp/ait/articles/1902/08/news022.html
手順②Usersコントローラーの作成
最低限必要になるのは、Userの作成(登録)とsignupの画面だけなので、「new」「create」だけ作っておく。追加したければ後で追加すれば良い。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class UsersController < ApplicationController def new @user = User.new end def create @user = User.new(user_params) if @user.save redirect_to root_path else render action: "new" end end private def user_params params.require(:user).permit(:username, :email, :password, :password_confirmation) end end |
手順③ユーザー登録フォーム(signup)の作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# app/views/users/new.html.erb <h1>ユーザー登録</h1> <%= form_for @user do |f| %> <%= render 'layouts/error_messages', model: f.object %> <div class="form-group"> <%= f.label :username, 'ユーザー名' %> <%= f.text_field :username, class: 'form-control' %> </div> <div class="form-group"> <%= f.label :email, 'メールアドレス' %> <%= f.text_field :email, class: 'form-control' %> </div> <div class="form-group"> <%= f.label :password, 'パスワード' %> <%= f.password_field :password, class: 'form-control' %> </div> <div class="form-group"> <%= f.label :password_confirmation, 'パスワード(確認)' %> <%= f.password_field :password_confirmation, class: 'form-control' %> </div> <%= f.submit '作成', class: 'btn btn-primary' %> <% end %> |
これで簡単なユーザー登録機能が完成!!
ここからいよいよ、ログイン機能の実装です!!
手順④sessionsコントローラーの作成(コントローラー名は何でもOK)
■create:ログインを完了
■destroy:セッションを破棄(ログアウト)
手順⑤ルーティングを編集
1 2 3 4 5 6 7 8 9 10 11 |
Rails.application.routes.draw do get 'login' => 'sessions#new' post 'login' =>'sessions#create' delete 'logout' => 'sessions#destroy' get 'signup' => 'users#new' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing .html resources :users, only: [:create] end |