あしあと

明日の自分への情報発信

Rails(progate)の学習(8日目)とRailsチュートリアルの学習(1日目)

今日でprogateのrails終わりだあああああああ!!!

 

今日の目標

railsのパスワードの暗号化を学ぶ

ログインパスワードは今のままではデータベースに普通の文字列として保存されており、万が一見られたり盗まれたとき、いとも簡単にパスワードがわかってしまう。

f:id:keropp1234:20200123065900p:plain

 

その対策として暗号化されたパスワードをデータベースには保存しておくとよい。

f:id:keropp1234:20200123070045p:plain

暗号化を使う際には「gem」を用いる。gemとはrubyrailsでよく使う機能をまとめてパッケージしたもの。「検索機能を作るgem」や「暗号化するジェム」がある。今回はbcryptという「暗号化するためのgem」を使います(crypt = 暗号。暗号資産と同じだね)。

f:id:keropp1234:20200123070411p:plain

 

railsにはインストールしたいgemを記述した「Gemfile」というものがある。gemファイルの名前は右画像のように「gem "ジェムの名前","ver"」となっている。verを指定しないと最新のgemをインストールする。「rails new」コマンドで生成されたGemfileには既にいくつかのgemが書かれてインストールされている。ちなみに下の.lockファイルは編集することはないので気にすることはない。

f:id:keropp1234:20200123070851p:plain

 

ではGemfileにインストールするgem名を記述し、rails consoleでインストールしてみる。その際には「bundle install」と打ち込めばインストールできる。

f:id:keropp1234:20200123071220p:plain

 

ではどう使うか。user.rbにbcryptをインストールするとhas_secure_passwordというメソッドが使えるようになる。このメソッドを追加することで、自動的に暗号化されるようになる。

f:id:keropp1234:20200123071516p:plain

 

暗号化されたパスワードを保存するためのカラムを作成する。今回はすでにあるpasswordカラムは使用せず、password_digestカラムを使用する。そのためpasswordカラムを削除し、password_digestカラムを追加する。

 

 

これまではマイグレーションファイルで一つのカラムを追加してきたが、図のようにchangeクラスの中で複数のファイルを指定し、rails

 


consoleで生成することもできる。

f:id:keropp1234:20200123072057p:plain

 

マイグレーションファイルを作るためにrails g migrationを用いる。

今回は複数のカラムを変更するため、change_users_columnsというファイル名にする。ファイルを作成したら、まず右の図のようにpassword_digestカラムが追加されるよう、マイグレーションファイルを編集する。f:id:keropp1234:20200123181003p:plain

 

次にpasswordカラムが削除されるように、remove_columnで削除するカラムを指定し、ターミナルでrails db:migrateを実行して変更をデータベースに反映させる。f:id:keropp1234:20200123181005p:plain

 

password_digestカラムにパスワードを保存するときには、左の図の通り、これまでと同じように値を代入すれば、has_secure_passwordによって自動的に暗号化されるので、passwordに関するコードに変更を加える必要はない。

f:id:keropp1234:20200123182012p:plain

 

暗号化されたパスワードでログインするには

現状のloginアクションでは、「フォームに入力されたメールアドレスとパスワードに一致するユーザーが存在すればログイン」となってい流ため、図のようなステップでログインできるようにします。

f:id:keropp1234:20200123182438p:plain

has_secure_passwordメソッドを有効にすると、authenticateメソッドを使えるようになる。authenticateメソッドは渡された引数を暗号化し、password_digestの値と一致するかどうかを判定してくるため、右の図のようにauthenticateメソッドを使って、「送信されたメールアドレスと一致するユーザー」のpassword_digestと、送信されたパスワードが一致するかどうかでログイン処理をする。これにより、送信されたメールアドレスとパスワードが一致していれば、データベース上に暗号化パスワードが存在していても、ユーザーが登録したパスワードでログインできるようになる。

f:id:keropp1234:20200123182609p:plain

 

Railsチュートリアル第一章

さぁいよいよRailsチュートリアルに突入。しっかり行こう