Ruby on Rails チュートリアル:実例を使って Rails を学ぼう の2周目です。
第8章 ログイン、ログアウト | Rails チュートリアル
第8章 ログイン、ログアウト
sessionを利用したログイン機能の実装。
cookieを利用した永続化。
そのあと、ユーザーが選択できるようにremember-me機能の実装、
となかなか盛りだくさんですが、内容はとても良いです。
(「8.4.1 記憶トークンと暗号化」の冒頭のセキュリティについて言及しているところも良い。)
一回実装してみて、もう一度整理しながら読み直すと良いです。
authenticateメソッド
has_secure_password が提供する authenticate メソッドで認証する。
digestメソッド
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost)
ファイル単位でのtest実施
bundle exec rake test TEST=test/integration/users_login_test.rb
テスト名を指定してtest実施
bundle exec rake test TEST=test/integration/users_login_test.rb \ TESTOPTS="--name test_login_with_valid_information"
ヘルパーメソッドはテストから呼び出せない
ややこしいが、is_logged_in? メソッドを logged_in? とは別にtest_helper に実装する理由。 余談ですが、double bang は推奨しないようなんですね。(rubocopでも怒られますし)
def is_logged_in? ## !!session[:user_id] !session[:user_id].nil? end
session
sessionメソッドで作成した一時cookiesは自動的に暗号化される
(ただし一時セッションのみ)
bcryptのハッシュは復号化できない
redirectのテスト
# リダイレク先が正しいかどうか assert_redirected_to @user # 実際にそのページに移動 follow_redirect!
assert_select count:
assert_select "a[href=?]", login_path, count: 0
cookies.signed
cookieの暗号化
sessionが使えるのはintegration testの場合のみ
test_helper で以下を実装。
# 統合テスト内ではtrueを返す def integration_test? defined?(post_via_redirect) end