2014-01-09 117 views
1

大家好,我的問題是,我設置了自定義用戶提供,當我要登錄還給我錯誤: there is no user provider for userSymfony2的自定義用戶提供身份驗證後刷新

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

但是當我PRES 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) { $用戶= $令牌的> getCredentials(顯示);如果(!is_array($ user)){ $ user = $ token-> getUser(); }

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

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

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

}如果我禁用所有3條線

0

則可以禁用這三條線,如果這個bug 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

沒有什麼變化,或者如果我只禁用此'!$這個 - > supportsClass(get_class($用戶)'聲明 – Vardius

+0

你檢查,如果symfony中調用你的代碼?你可以通過添加芯片或調試 –

+1

我認爲它沒有調用'createToken()'方法 – Vardius

相關問題