SecurityServiceProviderを使用して Silex アプリケーションを保護していますが、 logout_pathルートに移動してユーザーがログアウトした後にメッセージを表示したいと考えています。
私のテンプレートが後で自動的に表示できるように、メッセージはセッションフラッシュバッグに保存する必要があります。
アプリケーションミドルウェアを追加しようとしましたが、コードをフックできませんでした。セキュリティの後に発生し、セキュリティがホームページにリダイレクトされた後に発生するため、before フックが機能していないようです。
Application::EARLY_EVENTの before フックは、私の知る限り、セキュリティ プロバイダがログアウト後にセッションを破棄するため、早すぎるようです。
ある種の機能するがおそらく汚い解決策を見つけようとする前に、この場合の最良/最もクリーンな解決策は何でしょうか?
更新:ログアウト イベント ハンドラーの npms ヒントの後、Google でこの記事を見つけました。この記事では、Symfony で問題に非常にうまく取り組む方法が説明されています。
ただし、Silex では状況が少し異なり、SecurityServiceProviderのソースを読んだ後、このソリューションを思いつきました。
$app['security.authentication.logout_handler._proto'] = $app->protect(function ($name, $options) use ($app) {
return $app->share(function () use ($name, $options, $app) {
return new CustomLogoutSuccessHandler(
$app['security.http_utils'],
isset($options['target_url']) ? $options['target_url'] : '/'
);
});
});
class CustomLogoutSuccessHanler extends DefaultLogoutSuccessHandler {
public function onLogoutSuccess(Request $request)
{
$request->getSession()->getFlashBag()->add('info', "Logout success!");
return $this->httpUtils->createRedirectResponse($request, $this->targetUrl);
}
}
ただし、問題は、リダイレクト後に flashbag メッセージが存在しないことです。そのため、ログアウト成功ハンドラーが実行された後にセッションが破棄されているようです...または何か不足していますか? これは正しい方法ですか?
更新:まだ適切な解決策をまだ見つけていません。しかし、これは機能します。
ログアウトのターゲット URL にパラメーターを追加し、それを使用してログアウトが行われたかどうかを検出します。
$app->register( new SecurityServiceProvider(), array(
'security.firewalls' => array(
'default' => array(
'pattern'=> '/user',
'logout' => array(
'logout_path' => '/user/logout',
'target_url' => '/?logout'
),
)
)
));