【Rails】bcryptを使ってログイン機能を実装する方法
「bcrypt」はパスワードを安全に扱うためのgemパッケージです。
今回はそんなbcryptを使い、Railsでログイン機能を実装します。
1. bcryptをインストール
Gemfile
の上の箇所のコメントアウトを外します。
Bundlerでインストールしてあげます。
2. パスワード用のカラムを追加
まずマイグレーションを生成。今回はUser
にパスワードを設定したいので、User
用のものを指定します。
User
テーブルにpassword_digest
というカラムを追加します。パスワードを扱う際にはこの命名にする必要があります。
そうしたらマイグレーションを実行してあげます。
もし上のようなエラーが出た場合は、以下の記事を参考にしてください。
ruby/rails-bcrypt-not-installed)
3.「has_secure_password」を記述
User.rb
にhas_secure_password
を追記します。これはパスワードを扱うためのおまじない的なものだと思ってもらえれば大丈夫です。
これによりpassword
とpassword_confirmation
という2つのカラムがUser
クラスに追加されます。
ちなみにどちらもNOT NULL
かつ同じ値、というバリデーションがデフォルトで設定されます。
4. パスワードを保存
Railsコンソールで実際に上の2つのカラムの値を指定し、保存できればOK。
5. コントローラーを作成
ログインのためのコントローラーを作ります。
まずroute.rb
に上のように記述してあげます。
次にlogins
コントローラーを作ります。
次にLoginsController
にログインとログアウトの処理を実装。
今回は簡易的なものですが、4行目でパスワードが合っているかをチェックし、5行目でセッションデータに値を入れログインを実現しています。
authenticates
メソッドは、引数で指定したパスワードが合っていればモデルオブジェクトを返してくれます。
6. フォームを実装
erb
ファイルにて、LoginsController
で必要なログインIDとパスワードを入力するフォームを実装します。
7. ログイン中のユーザーを取得
ログインユーザー(ログイン状態)を取得するcurrent_user
メソッドをapplication_controller
に実装。これで全てのコントローラーでログイン状態を取得できます。
8. ログイン状態を表示
適当なerb
ファイルを作成し、ログインしている場合にユーザー名とログアウトボタンを表示するようにします。
適当なログインIDとパスワードを入力すると⋯
ユーザー名が表示され、無事ログインできました。