#プログラミングの勉強日記
2020年7月25日 Progate Lv.223
Ruby on RailsⅩⅠ
#概要
今まで作成したアプリはパスワードが普通の文字列として保存されている。これだと、PCの覗き見やハッキングされデータが盗まれた場合にそのパスワードを使って簡単に他人のアカウントに不正ログインできる。
→安全性の高いパスワードは万が一覗き見やデータが盗まれてもパスワードの内容がわからない状態である。パスワードを複雑な文字列(暗号化された特殊な文字列)にすることで安全性を高められる。
#Gemfileの編集
Railsでパスワードを暗号化するときはgem(読み方:「ジェム」)というツールを利用する。gemはRubyやRailsでプログラミングをするときに「よく使う機能」をパッケージ化したものである。様々なgemが存在するが、今回はbcrypt
という暗号化するためのgemを使う。
Railsにはインストールしたいgemを記述するGemfileというファイルが存在する。gem 'gemの名前'
と記述する。rails new
コマンドで生成されたGemfileにはすでにいくつかのgemが書かれてインストールされている。
gem 'gemの名前', 'gemのバージョン'
とすると、そのバージョンがインストールされる。バージョンを指定しないと、最新のgemがインストールされる。
gem 'rails', '5.0.3'
gem 'puma', '3.6.2'
bcryptのインストール
gem 'bcrypt'
$ bundle install
#暗号化する
- bcryptをインストールすると
has_secure_password
というメソッドが使えるようになる。パスワードを扱うUserモデルにhas_secure_password
を追加する。これでユーザを保存するときに自動的にパスワードを暗号化する。
class User < ApplicationRecord
has_secure_password
end
has_secure_password
はpasswordが存在するか自動的にチェックする。
-
passwor_digest
カラムを追加する。has_secure_password
メソッドは暗号化したパスワードをpasswor_digest
カラムに保存する。rails generate migration
コマンドでマイグレーションファイルを作成し、passwor_digest
カラムが追加されるように編集する。次にpassword
カラムが削除されるように編集する。カラムの削除はremove_column
を使う。1つのマイグレーションファイルで複数のカラムを変更できる。
$ rails generate migration change_users_columns
マイグレーションファイル変更後
$ rails db:migrate
class ChangeUsersColumns < ActiveRecord::Migration[5.0]
def change
add_column :users, :password_digest, :string
remove_column :users, :password, :string
end
end
-
password_digest
カラムに暗号化されたパスワードを保持するためには今まで通りpassword
に値を代入する。これで、has_secure_password
によってpassword
に代入された値が暗号化され、password_digest
カラムに保存される。なので、すでにあるpassword
に関するコードは変更しなくていい。
#暗号化されたパスワードでのログイン
フォームに入力されたメールアドレスに一致するユーザを取得し、フォームに入力されたパスワードと取得したユーザのパスワードが一致するかを判定する。has_secure_password
メソッドを有効にするとauthenticate
メソッドを使えるようになる。authenticate
は渡された引数を暗号化し、password_digest
の値と一致するかどうかを判定する。authenticate
メソッドを使って、「送信されたメールアドレスと一致するユーザ」のpassword_digest
と送信されたパスワードが一致するかどうかでログイン処理をする。
def login
@user = User.find_by(email: params[:email])
if @user && @user.authenticate(params[:password])