fix: 2段階認証の再設定ルートを /setting 配下から移動 (#6406)#6893
Conversation
権限管理で拒否URLに `/setting` を設定すると、その権限を持つメンバーが 2段階認証を再設定できない問題を修正する。 2段階認証の再設定 (`admin_setting_system_two_factor_auth_edit`) は `/setting/system/two_factor_auth/edit` に配置されていたため、 AuthorityVoter の前方一致による拒否URL判定で `/setting` にマッチし、 本人向けの操作にもかかわらず 403 で弾かれていた。 パスワード変更 (`/change_password`) と同様に本人向けアクションであるため、 ルートパスを `/two_factor_auth/edit` へ移し `/setting` 名前空間から外す。 ルート名は後方互換のため据え置き、メニューのリンク (default_frame.twig) は ルート名参照のため変更不要。`/admin` 配下のため ROLE_ADMIN 認可は維持される。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
📝 WalkthroughWalkthrough2要素認証再設定コントローラーのルートパスが Changes2FA再設定ルート変更と検証
Estimated code review effort: 1 (Trivial) | ~5 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## 4.4 #6893 +/- ##
==========================================
- Coverage 75.32% 75.22% -0.11%
==========================================
Files 519 519
Lines 25483 25483
==========================================
- Hits 19196 19169 -27
- Misses 6287 6314 +27
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
nanasess
left a comment
There was a problem hiding this comment.
LGTM です。ローカル(SQLite)で動作とテストを確認しました。
修正内容の確認
AuthorityVoter は preg_match("/^(\/{$adminRoute}{$denyUrl})/i", $path) による前方一致でパスを判定し、認可は EccubeExtension の ['path' => '^/%eccube_admin_route%/', 'roles' => 'ROLE_ADMIN'] + access_decision_manager.strategy: unanimous で効くため、拒否URL /setting があると旧パス /admin/setting/system/two_factor_auth/edit は kernel.request の AccessListener 段階で 403 になります。パスを /admin/two_factor_auth/edit へ移すことで前方一致から外れる、という因果関係を確認しました。Issue #6406 のコメントで合意された方針とも一致しています。
副作用がないことの確認
- 2段階認証の強制リダイレクトへの影響なし:
TwoFactorAuthListenerのROUTE_EXCLUDE/ROUTE_EXCLUDE_WHEN_NOT_CONFIGUREDはルート名の完全一致(in_array($route, self::ROUTE_EXCLUDE))で判定しているため、パスが/two_factor_auth/配下へ移動しても除外判定には影響しません。MFAバイパスは発生しません。edit()冒頭のisAuth()チェックも維持されています。 - 旧パスの残存参照なし:
setting/system/two_factor_authを全文検索した結果、ヒットはテストのコメント1件のみでした。default_frame.twigはルート名参照(url("admin_setting_system_two_factor_auth_edit"))、zap/scripts/admin_member_setting.zstも/admin/two_factor_auth/setのみで影響ありません。 - ルート名を据え置いた判断が適切: ルート名はプラグインから参照され得る公開APIであり、また
_routeによる分岐にも使われるため、据え置きが最も安全です。テンプレートを@admin/Setting/System/two_factor_auth_edit.twigのまま残した点も、app/template/での上書き互換が保たれるので適切だと思います。
動作確認(ローカル / SQLite)
| 検証 | 結果 |
|---|---|
TwoFactorAuthControllerTest 全6件 |
パス |
| 修正を revert して再実行 | 新規テストが 403 で失敗(回帰テストとして機能) |
拒否ルール自体の実効性(/setting/shop/delivery) |
403(拒否設定は有効) |
拒否URL /setting 下で 2FA 認証後に再設定画面へアクセス |
200(Issue の再現手順が解消) |
Issue #6406 の再現手順が解消されることを実機相当で確認できました。ありがとうございます!
概要(Overview・Refs Issue)
Closes #6406
権限管理でシステム設定(
/setting)を拒否URLに設定すると、その権限を持つメンバーが自分の2段階認証を再設定できない問題を修正します。2段階認証の再設定 (
admin_setting_system_two_factor_auth_edit) は/setting/system/two_factor_auth/editに配置されていたため、AuthorityVoterの前方一致による拒否URL判定で拒否URL/settingにマッチし、本人向けの操作にもかかわらず 403 (Access Denied) で弾かれていました。一方「パスワード変更」は
/change_password(/setting配下でない)のため影響を受けず、Issue の指摘通りの差になっていました。方針(Policy)
/setting/system)配下に置くのが不適切でした。admin_change_password(/change_password)に倣い、ルートパスを/two_factor_auth/editへ移し/setting名前空間から外します。既存のadmin_two_factor_auth(/two_factor_auth)・admin_two_factor_auth_set(/two_factor_auth/set)とも名前空間が揃います。実装に関する補足(Appendix)
admin_setting_system_two_factor_auth_editは後方互換のため据え置きました。メニューのリンク(default_frame.twig)はルート名参照(url(...))のため変更不要です。プラグイン等がルート名で参照している場合も影響ありません。/admin/setting/system/two_factor_auth/editは 404 になります)。この画面は管理画面右上メニューの「2段階認証 設定」からルート名で遷移するため、通常導線に影響はありません。/admin配下のままなのでROLE_ADMINの認可は引き続き有効で、認可レベルの防御は失われません(拒否URLの粒度だけが変わります=本Issueの狙い)。テスト(Test)
testEditIsNotForbiddenWhenSettingUrlIsDeniedを追加。拒否URL/settingを持つ権限のメンバーが再設定画面にアクセスしても 403 にならないことを検証します(修正前のパスでは 403 で失敗することも確認済み)。TwoFactorAuthControllerTest(5件) が通ることを確認。マイナーバージョン互換性保持のための制限事項チェックリスト
🤖 Generated with Claude Code
Summary by CodeRabbit
/settingのアクセス制限がある環境でも、2段階認証の再設定画面を開けるようになりました。