そこで、もう少し調べてみるとListener
、カスタム認証プロバイダーのクラスが正しく記述されていないことがわかりました。Token
ページが読み込まれるたびに新しいものが作成されるように書かれています。
その結果、2つのことを行う必要がありました。
1つ目は、認証リスナーをSymfonyファイアウォールリスナーの認証リスナーと同様に変更することでした。その一般的な構造を以下に示します。
if (null !== $token = $this->securityContext->getToken()) {
if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() &&
$token->getUsername() === $username) {
return;
}
}
これらのリスナーは基本的に、特定の条件が満たされている場合、新しいトークンを作成せずに認証を続行できるようにします。これらの条件は、トークンが正しいトークンのインスタンスであり、認証されており、ユーザー名がログインしているユーザーのユーザー名と一致していることです。
次に、元のユーザーがユーザーを切り替えようとした場合に、元のユーザーに基づいて認証をチェックするように、このコードを変更する必要がありました。この問題では、他の誰かが抱えていた同様の問題について詳しく説明します。修正は、ロールを循環してを検索し、SwitchUserRole
そのデータを使用して認証することでした。以下のパッチをコピーしました。これは、if
上記の最初のステートメントの後にあります。
foreach ($token->getRoles() as $role) {
if ($role instanceof SwitchUserRole) {
$token = $role->getSource();
break;
}
}
同時に、認証リスナーは、特定の条件を満たさない場合にのみ新しいトークンを作成し、別のトークンを偽装しているユーザーは、偽装しようとしているユーザーの資格情報ではなく、認証のテストに使用される資格情報を持ちます。