フロントエンドとバックエンドで別々のファイアウォールと認証システムを使用したい Web サイトをセットアップしています。だから私security.yml
は以下のように構成されています。初期の開発段階で in_memory ユーザー プロバイダーを使用しています。
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
backend_in_memory:
memory:
users:
admin: { password: admin, roles: [ 'ROLE_ADMIN' ] }
frontend_in_memory:
memory:
users:
user: { password: 12345, roles: [ 'ROLE_USER' ] }
firewalls:
# (Configuration for backend omitted)
frontend_login_page:
pattern: ^/login$
security: false
frontend:
pattern: ^/
provider: frontend_in_memory
anonymous: ~
form_login:
check_path: login_check_route # http://example.com/login_check
login_path: login_route # http://example.com/login
access_control:
# (Configuration for backend omitted)
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_USER }
バックエンド部分は関係ないので割愛します。省略された部分がコメントアウトされている場合、問題はまだそこにあります。
問題は、上記の構成ではフロントエンド認証が機能しないことです。これが私がしたことです:
- http://example.com/login にアクセスしてください
- 資格情報 (user:12345) を入力し、[ログイン] をクリックします。
- http://example.com/login_checkはユーザーを認証します
- 認証サービスは、ユーザーをhttp://example.com/にリダイレクトします。エラーはスローされません。実際、debug_redirects オプションをオンにすると、リダイレクト ページで「ユーザー」が認証されていることが明確に示されます。
予想される動作: セキュリティ トークンは、リダイレクトに従って「ユーザー」としてログインし、インデックス ページに戻ることを示す必要があります。
実際の動作: リダイレクトに従ってインデックス ページに戻った後も、セキュリティ トークンは「匿名」ログインを表示します。
しかし、ほぼ同じ設定 (パスとルート名は同じではありません) で、バックエンド部分は正しく動作します。
調査の結果、原因は現在のユーザー プロバイダーの記述方法にあることがわかりました。frontend_in_memoryセクションは、バックエンド認証に使用されるbackend_in_memoryの下に配置されていることに注意してください。そのため、フロントエンド ファイアウォールのfrontend_in_memoryプロバイダーを明示的に指定します。そして、それはうまくいきます-フロントエンドのログインページで「user:12345」でログインする必要があります。「admin」でログインしても機能しません。したがって、正しいユーザー プロバイダーを使用している必要があります。しかし、 backend_in_memoryである最初のユーザープロバイダーから「ユーザー」アカウントをまだ検索しているため、フレームワークがセキュリティトークンを正しく更新できないと思われます。実際、次の変更のいずれかを使用して、上記の構成を機能させることができます。
- backend_in_memoryプロバイダーのユーザー リストに「ユーザー」ログインを追加します(パスワードは同じである必要はありません)。
- frontend_in_memoryをbackend_in_memoryと交換して、frontend_in_memoryが最初のユーザー プロバイダーになるようにします。
もちろん、それらはこの問題を解決する正しい方法ではありません。バックエンドに「ユーザー」アカウントを追加しても意味がありません。2 つのユーザー プロバイダーの順序を入れ替えると、フロントエンドは修正されますが、バックエンドは壊れます。
何が問題なのか、これを修正する方法を知りたいです。ありがとうございました!