2016-07-05 5 views
1

Symfony 3では、ユーザを直接認証するために正しく動作しているカスタムガードオーセンティケータを使用しています。ユーザー偽装をサポートしたいが、_switch_userクエリパラメータを使用してユーザーを偽装しようとすると、getUser()オブジェクトは常に元のユーザーになります。私のオーセンティケータはガードで認証するときにsymfonyでユーザを偽装する

class AppAuthenticator extends AbstractGuardAuthenticator 
 
{ 
 
    public function getCredentials(Request $request) 
 
    { 
 
     $username = $request->query->get('username'); 
 
     if (empty($username)) { 
 
      return; 
 
     } 
 

 
     return array(
 
\t \t  'username' => $username, 
 
     ); 
 
    } 
 

 
    public function getUser($credentials, UserProviderInterface $userProvider) 
 
    { 
 
     $username = $credentials['username']; 
 
     \t return $userProvider->loadUserByUsername($username); 
 
    } 
 

 
    public function checkCredentials($credentials, UserInterface $user) 
 
    { 
 
     return true; 
 
    } 
 

 
    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) 
 
    { 
 
     return null; 
 
    } 
 

 
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
 
    { 
 
\t \t $data = array(
 
\t \t \t \t 'message' => strtr($exception->getMessageKey(), $exception->getMessageData()) 
 

 
\t \t \t \t // or to translate this message 
 
\t \t \t \t // $this->translator->trans($exception->getMessageKey(), $exception->getMessageData()) 
 
\t \t); 
 

 
\t \t return new JsonResponse($data, 403); 
 
    } 
 

 
    public function start(Request $request, AuthenticationException $authException = null) 
 
    { 
 
     return new RedirectResponse(
 
      ... 
 
      ) 
 
    } 
 

 
    public function supportsRememberMe() 
 
    { 
 
     return false; 
 
    } 
 

 
}

は、それはそう

security: 
 

 
    encoders: 
 
     Symfony\Component\Security\Core\User\User: plaintext 
 

 
    providers: 
 
     app: 
 
      entity: 
 
       class: AppBundle:Authentication 
 
       property: username 
 

 
    firewalls: 
 
     dev: 
 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
 
      security: false 
 

 
     main: 
 
      anonymous: ~ 
 
      switch_user: true 
 
      guard: 
 
       authenticators: 
 
        - app.authenticator 
 

 
    role_hierarchy: 
 
     ROLE_ADMIN:  ROLE_USER 
 
     ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 
 

 
    access_control: 
 
     - { path: ^/admin/, role: ROLE_ADMIN } 
 
     - { path: ^/, role: ROLE_USER } 
 
​

ある

マイセキュリティ設定がされているgetCredentials()私認証者のthodが常に呼び出され、私はこれで偽装を検出する方法が見えません。だから、私の質問は、ユーザがガード認証を使用するときに偽装される可能性があります。もしそうなら、私は何が欠けていますか?

答えて

1

私はこれを行う方法を見つけましたが、ネイティブswitch_userシステムに依存せず、アプリケーションロジックに依存しています。原理は基本的なものです

、あなたのUserクラス上の2つのプロパティに基づいて、独自のスイッチング・システムを実装しています:

  • 偽装
  • を偽装するために、ユーザのユーザ名を格納する文字列値impersonatedBy:含む文字列値(なしデシベルストレージ)偽装に

NBを行うユーザのユーザ名:あなたは、これらのプロパティにユーザーを保存することもできます(例:ユーザー(のgetUser)を検索するために、あなたのガードオーセンティケータを伝えるとき

だから、あなたは、ユーザーの偽装1(する$ user-> getImpersonate)、それに追加するユーザーを返すようにUserProviderを頼む)教義でマッピングそれは偽装を行います($ impersonatedUser-> setImpersonatedBy)。

関連する問題