2014-01-09 3 views
1

안녕 내 문제는 내가 정의 사용자 공급자를 설정한다는 것입니다 새로 고침 : there is no user provider for userSymfony2 사용자 정의 사용자 공급자 인증합니다 후,

There is no user provider for user "MainBundle\Security\User\SsoUser". 

을하지만 난 대가로 F5는 페이지를 새로 고침 할 때 공장! 왜 그것이 문제가되는 것입니까? 내 설정은 다음과 같습니다

secured_area: 
     pattern: ^/ 
     simple_preauth: 
      authenticator: sso_authenticator 

내 autenticator 클래스 :

/** 
* @Service("sso_authenticator") 
*/ 
class SsoAuthenticator implements SimplePreAuthenticatorInterface 
{ 

    /** 
    * @var SsoUserProvider 
    */ 
    protected $userProvider; 

    /** 
    * @InjectParams({ 
    *  "userProvider" = @Inject("sso_user_provider") 
    * }) 
    */ 
    public function __construct(SsoUserProvider $userProvider) 
    { 
     $this->userProvider = $userProvider; 
    } 

    public function createToken(Request $request, $providerKey) 
    { 
     $user = $request->getSession()->get('sso_user'); 

     if (!$user) { 
      throw new BadCredentialsException('No user found'); 
     } 

     return new PreAuthenticatedToken(
       'anon.', $user, $providerKey 
     ); 
    } 

    public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey) 
    { 
     $user = $token->getCredentials(); 

     $sso_user = $this->userProvider->loadUser($user); 

     return new PreAuthenticatedToken(
       $sso_user, $user, $providerKey, $sso_user->getRoles() 
     ); 
    } 

    public function supportsToken(TokenInterface $token, $providerKey) 
    { 
     return $token instanceof PreAuthenticatedToken && $token->getProviderKey() === $providerKey; 
    } 

} 

SsoUserProvider 클래스 :

/** 
* @Service("sso_user_provider") 
*/ 
class SsoUserProvider implements UserProviderInterface 
{ 

    public function loadUser($user) 
    { 
     return new SsoUser($user['id'], $user['username'], $user['password'], null, $user['email'], array('ROLE_USER')); 
    } 

    public function loadUserByUsername($username) 
    { 
     throw new \RuntimeException('Method unsupported'); 
    } 

    public function refreshUser(UserInterface $user) 
    { 
     if (!$user instanceof SsoUser && !$this->supportsClass(get_class($user))) { 
      throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user))); 
     } 

     return $user; 
    } 

    public function supportsClass($class) 
    { 
     return $class === 'MainBundle\\Security\\User\\SsoUser'; 
    } 

} 

답변

2

은이 같은 authenticateToken() 방법 편집 이제 작동 :

공용 기능 authenticateToken (TokenInterface $ 토큰 UserProviderInterface $ userProvider, $ providerKey) { $ 사용자 = $ token-> getCredentials(); if (! is_array ($ user)) { $ user = $ token-> getUser(); 내가 3 선을 사용하지 않으면 }

if (!$user) { 
    throw new AuthenticationException('User does not exist.'); 
} 

$ssoUser = $this->userProvider->loadUser($user); 

return new PreAuthenticatedToken(
     $ssoUser, $user, $providerKey, $ssoUser->getRoles() 
); 

은}

0

당신이이 세 줄을 해제하고이 버그 occures 경우 다시 확인 할 수 있나요?

if (!$user instanceof SsoUser && !$this->supportsClass(get_class($user))) { 
      throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user))); 
     } 

나는 $user 유형 또는 !$this->supportsClas <에 문제가있을 수 있다고 생각 - '!'는이 있어야한다 기호?

+0

아무것도 변경하거나 내가 사용하지 않도록 경우에만이'! $ this-은> supportsClass 당신이 확인 했 – Vardius

+0

(get_class ($ 사용자)'문 심포니는 당신을 호출하는 경우 code? 당신은 die 또는 debugging을 추가하여 할 수있다. –

+1

나는'createToken()'메소드 – Vardius

관련 문제