SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

サンプルコードで学ぶRuby on Rails 5実践入門

Rails 5でログインフォームを実装する

サンプルコードで学ぶRuby on Rails 5実践入門 第5回

  • このエントリーをはてなブックマークに追加

 前回はscaffoldで自動生成したユーザー登録機能について、より実践的に拡張しました。今回はユーザー登録時にパスワードを登録できるようにした上で、ログインフォームを開発していきます。

  • このエントリーをはてなブックマークに追加

セキュアなパスワードの追加

 ログイン/ログアウト機能を実現するため、ユーザー登録時にパスワードを登録できるようにしましょう。パスワードをそのままテキストで保存することはセキュリティの面で安全ではないため、暗号化した上でパスワードを保存する必要があります。そのために、Railsが標準で提供するhas_secure_passwordメソッドを利用します。

 まずはhas_secure_passwordをUserモデルに記述します。

リスト1 app/models/user.rb
class User < ApplicationRecord
…(中略)…
  has_secure_password
end

 has_secure_passwordメソッドを利用するには、対象のテーブルにpassword_digestというカラムがあることが前提となります。また、最新のハッシュ関数を提供するbcryptというgemも必要となります。

 usersテーブルにpassword_digestカラムを追加するためのマイグレーションファイルを作成しましょう。

$ bin/rails g migration add_password_digest_to_users password_digest:string

  ↓

Running via Spring preloader in process 7013
      invoke  active_record
      create    db/migrate/20170119100814_add_password_digest_to_users.rb

 マイグレーションを実行します。

$ bin/rails db:migrate

 bcryptをインストールするためにGemfileのコメントアウトを以下の通り外しましょう。

リスト2 Gemfile
…(中略)…
# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'
…(中略)…

 bundleインストールします。

$ bin/bundle install

 has_secure_passwordメソッドは対象のモデルにpassword、password_confirmation仮想属性を与え、usersテーブルにpasswordカラムが存在しているかのような振る舞いを定義します。has_secure_passwordメソッド内部では、パスワードの検証に関する最低限のバリデーションを以下の3点追加しています。

  1. create時のpasswordが存在するか
  2. passwordが存在する場合にpassword_confimationが存在するか
  3. 仮想属性のpasswordとpassword_confimationが一致するか

 ここではより明示的にpasswordが空でないことを、「最小文字数が6文字であること」として定義し、対応するバリデーションを追加します。

リスト3 app/models/user.rb
class User < ApplicationRecord
…(中略)…
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }
end

ユーザー登録時のパスワード追加

 has_secure_passwordメソッドを追加したので、ユーザー登録時のフォームにもパスワードとパスワード確認の入力ボックスを追加し、ユーザー登録時にパスワードを登録できるようにしましょう。

 フォームのビューファイルにパスワードとパスワード確認の入力ボックスを追加します。

リスト4 app/views/users/_form.html.erb
…(中略)…
  <div class="field">
    <%= f.label :password %>
    <%= f.password_field :password %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %>
    <%= f.password_field :password_confirmation %>
  </div>
…(中略)…

 このままでも問題なさそうですが、実際にユーザー登録しようとするとパスワードのバリデーションエラーで登録できません。なぜなら以前紹介したように、Usersコントローラーのuser_paramsメソッドに定義されているstrong parametersが、パスワードデータを受け付けるようになっていないからです。

 user_paramsメソッドを以下のように変更しましょう。

リスト5 app/controllers/users_controller.rb
…(中略)…
    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.require(:user).permit(:name, :email, :password, :password_confirmation)
    end
…(中略)…

 これで無事にパスワードを指定して、ユーザー登録を行うことができるようになりました。説明は割愛しますが、/users/newにアクセスしてパスワードを指定し、ユーザー登録できることを確認してみてください。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Sessionsコントローラーと対応するルーティング・ビューの作成

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
サンプルコードで学ぶRuby on Rails 5実践入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 竹馬 力(チクバ ツトム)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10014 2017/03/17 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング