Ruby on Rails チュートリアルの第8章のメモです。第8章ではこれまたWebアプリケーションに欠かせないログイン・ログアウト機能を実装していきます!認証(authentication)システムの実装方法を学ぶことができます!
第8章 ログイン、ログアウト | Rails チュートリアル
セッション
HTTPはステートレスなプロトコル
- 前のリクエスト情報をまったく利用できない独立したトランザクション
- セッションという半永続的な接続をコンピュータ間に別途設定する
Railsでセッションを実装するのに簡単なのがcookies
cookiesとはユーザのブラウザに保存される小さなテキストデータ
今まで設定したルーティングの確認
bundle exec rake routes
レンダリングのないページにフラッシュメッセージを残す
flash
ではなくflash.now
を使う
session
メソッド
使用するとユーザのブラウザ内の一時cokkiesに暗号化済みのユーザIDが自動で生成される
メモ化コードを意識する!
if @current_user.nil?
@current_user = User.find_by(id: session[:user_id])
else
@current_user
end
一行で書くと、
@current_user = @current_user || User.find_by(id: session[:user_id])
さらにRubyっぽく書くと
@current_user ||= User.find_by(id: session[:user_id])
RailsにおけるRememer me
Railsのsessoin
メソッドを単に使用するだけでは、ブラウザを閉じるとセッション情報は消えてしまう
永続的Cookiesの作成は、セキュリティ上の欠陥が生まれやすいので注意する必要がある
cookieを盗み出す有名な4つの方法
- パケットスニファ
- データベースから直接記憶トークンを奪う
- クロスサイトスクリプティング(XSS)
- 物理的デバイスを直接操作
以下の方針をとってRemember meを実現
- 記憶トークンにはランダムな文字列を生成して用いる。
- ブラウザのcookiesにトークンを保存するときには、有効期限を設定する。
- トークンはハッシュ値に変換してからデータベースに保存する。
- ブラウザのcookiesに保存するユーザーIDは暗号化しておく。
- 永続ユーザーIDを含むcookiesを受け取ったら、そのIDでデータベースを検索し、記憶トークンのcookiesがデータベース内のハッシュ値と一致することを確認する。
テストされたいない箇所を発見するためのノウハウ
raise
を怪しい部分に埋め込んで例外を無理やり発生させる
テストを実行してエラーが発生しなかったらカバーできていない
Ruby on Rails チュートリアル 「第8章 ログイン・ログアウト」のまとめ
- Railsでは、あるページから別のページに移動するときに状態を保持できる
- 一時cookiesと永続cookiesどちらも使える
flash.now
メソッドを使うと、レンダリング済みのページにもフラッシュを使える- テスト駆動開発は、テストでバグを再現してからのデバッグに便利
session
メソッドを使用すると、ユーザのIDを安全にブラウザに保存してくれ一時セッションを作成できる- 統合テストでは、ルーティング、データベースの更新、レイアウトの変更などをテストできる
cookies
メソッドを使用すると、永続的な記憶トークンのcookiesをブラウザに保存して、永続的セッションを作成できる- セッションのユーザIDを削除し、ブラウザの永続的cookiesを削除すると、ログアウト!
ログイン・ログアウト周りはボリュームがすごかった
コーディングするので精一杯
3時間かかった
Ruby on Rails チュートリアル 第8章までかかった合計時間は13.5時間
続きの記事はこちら!
Ruby on Rails チュートリアル 「第9章 ユーザの更新、表示、削除」をやってみた
Ruby on Railsのおすすめ書籍はこちら!