Rails – パスワードの暗号化~bcrypt

概要

Gemの1つ、bcryptをインストールすることで、パスワードの暗号化が容易に実装できるようになる。手順の概要は、Userモデルを例にとると以下のようになる。

<ユーザー登録時>

  • bcryptを導入する
  • usersテーブルのパスワードカラムをpassword_digestとする
  • Userモデルにhas_secure_passwordメソッドを記述
  • サインインフォームに:passwordフィールドを置く
  • フォームからのPOSTに対してUserインスタンスを生成
  • Userインスタンスをデータベースに保存

<ユーザー認証時>

  • フォームのPOSTに対してユーザーを特定し、Userインスタンスを生成
  • フォームに入力されたパスワードパラメーターを使って、Userインスタンスのauthenticateメソッドで認証

手順

設定

  • 登録画面でユーザーの名前とパスワードを登録
  • 認証画面でユーザーの名前とパスワードを入力して認証

bcryptの導入

Gemfilebcryptのコメントを外す。なければ追加。

Railsサーバー停止状態でインストール。

ユーザーモデルの準備

マイグレーションファイルのパスワード属性はpassword_digestとする。

マイグレート後。

ルーティング

この例では4つのアクションを以下のようにルーティング

  • secure_sign_upで登録フォームを表示
  • secure_sign_up_processで登録処理(パスワードを暗号化)
  • secure_sign_inで認証フォームを表示
  • secure_sign_in_processで認証処理

ユーザー登録

登録画面

登録フォームの基本構成はシンプルで、パスワードは:passwordの名前でpassword_formを置くだけでよい。

登録処理

フォームからのPOSTに対して、:passwordを含むパラメーターでUserインスタンスを生成し、データベースに保存するだけでパスワードが暗号化される。

ユーザー認証

認証画面

認証画面も登録画面と同じで:passwardを拾えばよい。

認証処理

認証手順は以下の通り。

  1. ユーザー名などからデータベース上のユーザーを取り出してUserインスタンスを生成
  2. 生成したユーザーインスタンスのauthenticateメソッドにフォームパラメーターの:pasuwordの内容を与えて認証

認証の際に、@user&.authenticate...と「ぼっち演算子」を使っているのは、未登録ユーザーの場合にauthenticateメソッドがエラーとなるのを防ぐため。

実行結果

登録時

名前:山田、パスワード:yamadaとして登録した結果が以下の通り。

パラメーターで平文のパスワードが、インスタンス生成後にはダイジェストで保持されていて、この値がデータベースに保存される。

認証時

名前:山田、パスワード:yamadaとしてサインインした場合。

フォーム入力から生成されたUserインスタンスのpassword_digestが上の内容と等しくなっているのが確認できる。

また、authenticateの結果が正しい場合は、Userインスタンスが返されている。

異なるパスワードを入力した場合。

password_digestの値が異なっていて、authenticateの戻り値はfalse

存在しないユーザーを入力した場合。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です