6

スーパー管理者の役割と、さまざまな権限を持つさまざまなユーザーの役割を持つアプリケーションがあります。http://symfony.com/doc/current/book/security.html#impersonating-a-user_switch_userに示されているクエリを使用して、これらのユーザーのいずれかになりすますことができるようにしたいと思います。

ただし、URLの最後にクエリを追加すると、何も実行されないようです。私は長い間これをいじってみましたが、解決策を見つけることができないようです。私がログインしているユーザーが持っていることは知っていますがROLE_ALLOWED_TO_SWITCH、symfonyがどのようにそれを行うのか理解できないようです。

カスタム認証プロバイダーを使用しているので、それと関係があると思いますが、何を見る必要があるのか​​わかりません。必要なコードは投稿できますが、今何を投稿すればよいかわかりません。

4

1 に答える 1

4

そこで、もう少し調べてみると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;
    }
}

同時に、認証リスナーは、特定の条件を満たさない場合にのみ新しいトークンを作成し、別のトークンを偽装しているユーザーは、偽装しようとしているユーザーの資格情報ではなく、認証のテストに使用される資格情報を持ちます。

于 2012-08-30T19:15:31.977 に答える