2016-07-05 2 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 시스템에 의존하지 않고 응용 프로그램 로직과의 종속성을 가지고 있습니다.

  • 가장 할 :

    이 원리는 기본이다, 당신은 당신의 사용자 클래스의 두 가지 속성에 따라 자신의 스위칭 시스템을 구현을 가장 할 사용자의 사용자 이름을 저장하는 문자열 값

  • impersonatedBy : 포함하는 문자열 값 (NO DB 저장)를 가장에게

NB를하고있는 사용자의 사용자 이름 : 당신은 또한 해당 속성에 사용자를 저장할 수 있습니다 (예 : 당신이 사용자 (인 getUser)를 검색하기 위해 가드 인증을 말할 때

그래서, 당신은 사용자의 가장 된 하나 ($ 사용자 -> getImpersonate), 여기에 추가 사용자를 반환 할 UserProvider 문의) 교리와 매핑 그것은 가장 ($ impersonatedUser-> setImpersonatedBy)를 만듭니다.