Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BooksControllerでのログイン有無チェックを修正 #5921

Merged
merged 13 commits into from Jan 5, 2023

Conversation

peno022
Copy link
Contributor

@peno022 peno022 commented Dec 10, 2022

Issue

概要

http://localhost:3000/books はログインしないと閲覧できないページですが、 BooksControllerでは ログインの確認がされていなかったため、ログインせずにアクセスするとcurrent_userがnilの状態でviewが呼び出され、 /app/app/views/books/index.html.slimNoMethodError: undefined method admin_or_mentor? for nil:NilClassのエラーが発生していました。
同件のバグを防ぐことも考慮し、app/controllers/application_controller.rbbefore_action :require_loginを追加して、ログインが不要なページのみrequire_loginをskipする方針で修正しました。


#5788 の対応で行った

app/controllers/application_controller.rbbefore_action :require_loginを追加して、ログインが不要なページのみrequire_loginをskipする方針で修正

の修正について、本PRで対応することは変わらないですが、別issueとして切り出していただいています。


修正を進める中で、ポートフォリオページでもbooksページと同様のバグが発生しているのを見つけたので、あわせて修正しました。ログイン必須ページとなるように修正しています。


修正対象のファイルが多いですが、バグとなっていたapp/controllers/books_controller.rbapp/controllers/users/works_controller.rb以外は、仕様が変わらないよう機械的な修正になっています。

  • app/controllers/books_controller.rbについては、2点見直し
    • http://localhost:3000/books アクセス時にログイン済みかどうかチェックがされるようにすること
    • deleteアクションもadminまたはmentor権限が必要なはずなので、before_action: require_admin_or_mentor_loginの対象にすること
  • app/controllers/users/works_controller.rbについては、1点見直し
  • それ以外のファイルについては、現状のログインチェック内容から変わらないように、下記の手順に従って機械的に修正したものになるので、手順が正しいかどうか→手順に合わない修正が含まれていないかどうか、という観点で見ていただければと思います。

修正した手順

  1. app/controllers/application_controller.rbbefore_action :require_loginを追記
  2. < ApplicationControllerを含む全ファイルを検索(75ファイル)
  3. 対象の75ファイルのコントローラに対して、before_action :require_loginがあるものは削除
  4. ないもののうち、他の権限でのログイン確認も含まれていないものにはskip_before_action :require_login, raise: falseを追加(対象アクションが絞られているものはそれに従う)

変更確認方法

  1. bug/nomethoderror-on-books-without-loginをローカルに取り込む。
  2. ログインしていない状態で http://localhost:3000/books にアクセスする。
  3. 下記2点が確認できればOK。
  • 「500: Internal Server Error」のエラーが出なくなっていること
  • 「ログインしてください」のメッセージとともにトップページに遷移すること

Screenshot

ログインしていない状態で http://localhost:3000/books にアクセスした時:

変更前

スクリーンショット 2022-12-10 13 20 21

変更後

スクリーンショット 2022-12-10 13 21 22

@peno022 peno022 changed the title [WIP]application_controllerでログイン確認をするように修正 BooksControllerでのログイン有無チェックを修正 Dec 10, 2022
@peno022 peno022 marked this pull request as ready for review December 10, 2022 04:58
@peno022
Copy link
Contributor Author

peno022 commented Dec 10, 2022

@akingo55
おつかれさまです!こちらのPRのレビューをお願いしてもよいでしょうか?
(直近時間取れなくて難しいなどありましたら遠慮なくおっしゃってください🙏)

@peno022 peno022 self-assigned this Dec 10, 2022
Copy link
Contributor

@akingo55 akingo55 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確認しました!問題なさそうかと思います。

今回バグとなっていたBooksController以外については、現状のログインチェックの内容が正しいかどうかの検討は実施していません。

コード上はBooksController以外も修正しているので、それらも動作確認が必要かと思いました!(また別のバグを生む可能性もあるかと思うので)
私の方では問題なさそうでしたので、Approveします!

@peno022
Copy link
Contributor Author

peno022 commented Dec 11, 2022

@akingo55
ご確認ありがとうございました!🙏

今回バグとなっていたBooksController以外については、現状のログインチェックの内容が正しいかどうかの検討は実施していません。

こちらについて、すみません書き方がわるかったかもしれないのですが、「仕様が正しいかを改めて確認するということはせずに、現状の仕様のままになるように修正した」という意図でした。
とはいえ動作確認項目に書けてなかったので追加します🙇‍♀️ご指摘ありがとうございます🙇‍♀️

@peno022
Copy link
Contributor Author

peno022 commented Dec 13, 2022

@komagata
おつかれさまです!本PRに動作確認をどこまで含めるかご相談させてください🙏
バグ対象となっていたBooksControllerについてはもちろん動作確認・テスト実施するのですが、それ以外の修正ファイルの動作確認についてです。
修正ファイル数が64ファイルあり、全ファイル分手元で動作確認、またはテストの有無を確認してなければ追加、をやろうとするとかなり時間がかかりそうです。

  1. とはいえ全件テスト書く
  2. 単純にbefore_action :require_loginを削除またはskip_before_action :require_login, raise: falseを追加しただけ、というファイルはコードだけ確認してOKにし、only〜〜、admin条件など、その他の条件があるものだけ対象にしてテストを書く(対象8ファイル)
  3. コードだけの確認にして、あとは今のテストが通っていればOKにする‥?

くらいの選択肢が考えられるかなあと思ったのですが、2で進めることは問題あるでしょうか・・?

@komagata
Copy link
Member

@peno022 最初にお話しいただいた時に、これが念頭にあるのでやるかどうか迷ったのですが、やるからには全件テストで行きたいと思います。

分量が多くなるのでポイントを増やしておきたいと思います。

@peno022
Copy link
Contributor Author

peno022 commented Dec 15, 2022

@komagata 承知しました!🙇‍♀️

@peno022
Copy link
Contributor Author

peno022 commented Dec 20, 2022

@komagata
たびたびすみません、追加で一点質問させてくださいm
ログイン確認のテストが下記2ファイルに分かれているのですが、なにか背景があるでしょうか?

  1. test/system/require_login_test.rb
  2. test/system/login_requirements_test.rb

1には /users/#{@user_id} 配下のものしか書かれていないので今回は2にテスト追加する必要があるのか、そもそもまとめてしまってよいファイルなのか確認したいです。

@komagata
Copy link
Member

@peno022

ログイン確認のテストが下記2ファイルに分かれているのですが、なにか背景があるでしょうか?

本来はどちらかに統一すべきところを把握できていないので別のファイルに書いてしまったのだと思います。

もし作業時に問題なければ統一してしまっていただければ助かります〜。

@peno022 peno022 force-pushed the bug/nomethoderror-on-books-without-login branch from 16eb8ed to 4941816 Compare December 26, 2022 06:04
@peno022
Copy link
Contributor Author

peno022 commented Dec 26, 2022

@komagata
おつかれさまです!
テストの追加を実施中なのですが、量が多いため、まだ途中ですが方針について確認させてください🙇‍♀️
各パターン、一部のテストを追加した状態でいったんコミットしており、方針に問題がなければこのまま全件分進めようと思っています。

下記の形でテスト追加に着手したのですが、懸念あるでしょうか?
ご確認いただけますと助かります🙇‍♀️


before_action :require_loginを削除したのみのcontrollerのテスト
test/system/require_login_test.rbに、どれか1つのアクションに対して、ログインなしでアクセスすると「ログインしてください」が出ることを確認するテストを書く

skip_before_action :require_login, raise: falseを追加したのみのcontrollerのテスト
→同じくtest/system/require_login_test.rbに、どれか1つのアクションに対して、ログインなしでアクセスしてもページのコンテンツが表示されることを確認するテストを書く

③単純な削除/追加になっておらず、only/except等条件をつけたcontrollerのテスト
→各ページのシステムテストに追加(現在はtest/system/articles_test.rbのみテスト追加してあります)
対象:
app/controllers/articles_controller.rb
app/controllers/hibernation_controller.rb
app/controllers/retirement_controller.rb
app/controllers/users_controller.rb

④その他
app/controllers/api/admin/base_controller.rb
app/controllers/api/base_controller.rb
の変更については、apiのテストで権限確認をしているのでテスト追加なし。

@komagata
Copy link
Member

komagata commented Dec 27, 2022

@peno022

1

OKです〜。

2

できれば「どれか1つのアクション」ではなく全部のアクションをテストしたいです〜。

3

基本的にはOKです〜。

ログイン必須のテストはtest/system/require_loginディレクトリ以下にarticles_test.rbとかファイルを置いてく形でまとめるとわかりやすいかもですね。

もしくは、「ログインしてないとXXXという表示が出る」「ログインしていればXXXという表示がでない」というテストであればURLを渡すだけでテストできるような形に共通化して一気に処理できちゃうかもですね。

4

OKです〜。


すみません、認証関連の書き換えの件を以前は同じPRでいいといっちゃったんですが、共通化などを考えるとやはり別のIssueにした方がいいと思い直したので #5984 というIssueを作成しました。PRはこのままで大丈夫ですが、こちらの新しいIssueのポイントもGETできる感じで考えていただければ〜。

@peno022
Copy link
Contributor Author

peno022 commented Dec 29, 2022

@komagata
ご確認いただきありがとうございます!
2,3はご指摘いただいた形に修正して進めます🙏
ログイン処理共通化については別issueにして、同じPRで対応するという形にすることも承知しました🙏

@peno022 peno022 force-pushed the bug/nomethoderror-on-books-without-login branch from f66ed5c to d02a605 Compare December 30, 2022 08:08
@peno022
Copy link
Contributor Author

peno022 commented Dec 30, 2022

@komagata
おつかれさまです!年の瀬にすみません〜
テスト追加の対応を実施しましたので、PRのレビューをお願いしたいです🙇‍♀️

追記:
修正中に #5992 のバグを見つけたので、issue起票のうえあわせて修正しました。🙏

class UsersLoginTest < ApplicationSystemTestCase
include LoginAssertHelper
test 'cannot access users list without login' do
assert_login_required('/users')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert_login_required('/users')
assert_login_required '/users'

複雑な場合以外はかっこはなくていいかもです〜

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

修正しました!

assert_text 'ログインしてください'
include LoginAssertHelper
test 'redirect to welcome page and show message when you visit login required pages without login' do
assert_login_required('/announcements')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

とってもいい感じだと思います〜!

pathの配列を受け取るようにしてもいいかもですね。

Copy link
Contributor Author

@peno022 peno022 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@komagata
レビューありがとうございます!修正しましたので再度ご確認お願いします🙏

pathの配列を受け取る形にしてもいいかも、というご指摘については、そうできていなかった背景の懸念をコメントに記載させていただきました🙇‍♀️ ご確認いただけますと幸いです。

test 'redirect to welcome page and show message when you visit login required pages without login' do
assert_login_required '/announcements'
assert_login_required '/books'
assert_login_required "/companies/#{companies(:company1).id}/products"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちらについて、assert_login_requiredをたくさん書くことになるのでご指摘いただいたように配列を渡す形も検討したのですが、

paths = ['/announcements', '/books', '/companies']
paths.each do |path|
  assert_login_required(path)
end

もしくは

def assert_login_required(paths)
  paths.each do |path|
    visit path
    assert_text 'ログインしてください'
    assert_selector 'h3', text: 'フィヨルドブートキャンプとは?'
  end
end

のようにした場合、記述としては簡単になりますが、テストが失敗した時に、どのパスを渡した時でも同じ行がエラー行としてログに出てくるので、どれで失敗したかが分かりづらくなりそう、というのを懸念して、上記の形にはしませんでした。

配列を渡すにしても上記の問題は回避できる方法があれば、ご指摘いただけますと嬉しいです🙇‍♀️

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@peno022 なるほどですね。

でしたらそのままでいいと思います〜。

Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確認させて頂きました。OKです〜🙆‍♂️

test 'redirect to welcome page and show message when you visit login required pages without login' do
assert_login_required '/announcements'
assert_login_required '/books'
assert_login_required "/companies/#{companies(:company1).id}/products"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@peno022 なるほどですね。

でしたらそのままでいいと思います〜。

@komagata
Copy link
Member

komagata commented Jan 5, 2023

@peno022 作業量が多くて大変なIssueありがとうございます!お疲れ様です〜!

@komagata komagata merged commit 6e369ee into main Jan 5, 2023
@komagata komagata deleted the bug/nomethoderror-on-books-without-login branch January 5, 2023 03:53
@github-actions github-actions bot mentioned this pull request Jan 5, 2023
21 tasks
@peno022
Copy link
Contributor Author

peno022 commented Jan 5, 2023

@komagata 大きいPRになってしまいましたが、レビューありがとうございましたー!!🙌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants