2016-02-17 2 views
1

Я пытаюсь пройти аутентификацию через Аутентификатор паролей произвольной формы, я следую примеру Symfony на этой странице: Custom Form Password Authenticator, я изменил несколько фрагментов, чтобы поместить мою логику аутентификации. Все, кажется, работает отлично ... Но Symfony продолжал говорить мне, что я проверку подлинности как анонимный ... Вот код:Symfony 3 User Password Authenticator

Мой заказ Athenticator:

class SippyAuthenticator implements SimpleFormAuthenticatorInterface 
{ 
    private $sippyAccounts; 

    public function __construct(SippyAccounts $sippyAccounts) 
    { 
     $this->sippyAccounts = $sippyAccounts; 
    } 

    public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey) 
    { 
     $result = $this->sippyAccounts->login($token->getUsername(), $token->getCredentials()); 

     if($result->isError()) { 
      throw new CustomUserMessageAuthenticationException('Invalid username or password'); 
     } else { 
      $roles = array('ROLE_ACCOUNT'); 
      $user = new User($token->getUsername(), $token->getCredentials(), $roles); 

      $tokenNew = new UsernamePasswordToken($user, $user->getPassword(), $providerKey, $user->getRoles()); 
      return $tokenNew; 
     } 
    } 

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

    public function createToken(Request $request, $username, $password, $providerKey) 
    { 
     return new UsernamePasswordToken($username, $password, $providerKey); 
    } 
} 

Это моя безопасность .yml:

security: 
    providers: 
     in_memory: 
      memory: ~ 

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

     main: 
      anonymous: ~ 
      simple_form: 
       authenticator: sippy.authenticator 
       login_path: login 
       check_path: login 
    access_control: 
     - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/es/overview, roles: ROLE_ACCOUNT } 
+0

Вы можете найти что-нибудь, что связано с журналом ошибок Symfony? Использует ли '$ user-> getRoles()' что-нибудь? Выполняется ли '$ sippyAccounts-> login()' успешно? –

+0

Спасибо за ответ ... В журналах ошибок ничего нет и $ sippyAccounts-> login() успешно выполняются ... все выполняются нормально без ошибок ... Всего несколько минут назад я решил проблему ... Это было потому, что Я генерирую пользователя без вызова объекта $ userProvider, и кажется, что symfony вызывает этот объект ($ userProvider) для заполнения сеанса с ним ... –

ответ

0

проблема заключалась в том, что я генерация пользователя объекта без звонка $ userProvider (потому что я Жду» т реализовать его), и Symfony позже использовать этот объект ($ userProvider) в retrive уже autenticated пользователя и поставить его в сессии ... Ниже UserProvider класс и модифицированный SippyAuthenticator:

class SippyUserProvider implements UserProviderInterface 
{ 
    private $sippyAccounts; 

    public function __construct(SippyAccounts $sippyAccounts) 
    { 
     $this->sippyAccounts = $sippyAccounts; 
    } 

    public function loadUserByUsername($username) 
    { 
     $result = $this->sippyAccounts->informationByUsername($username); 

     if (!$result->isError()) { 
      $password = null; 
      return new SippyUser($username, $password, null, array('ROLE_ACCOUNT')); 
     } 

     throw new UsernameNotFoundException(
      sprintf('Username "%s" does not exist.', $username) 
     ); 
    } 

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

     return $this->loadUserByUsername($user->getUsername()); 
    } 

    public function supportsClass($class) 
    { 
     return $class === 'AppBundle\Model\SippyUser'; 
    } 
} 

class SippyAuthenticator implements SimpleFormAuthenticatorInterface 
{ 
    private $sippyAccounts; 

    public function __construct(SippyAccounts $sippyAccounts) 
    { 
     $this->sippyAccounts = $sippyAccounts; 
    } 

    public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey) 
    { 
     $result = $this->sippyAccounts->login($token->getUsername(), $token->getCredentials()); 

     if($result->isError()) { 
      throw new CustomUserMessageAuthenticationException('Invalid username or password'); 
     } else { 
      $user = $userProvider->loadUserByUsername($token->getUsername()); 

      $tokenNew = new UsernamePasswordToken($user, $user->getPassword(), $providerKey, $user->getRoles()); 
      $tokenNew->setAttributes($token->getAttributes()); 
      return $tokenNew; 
     } 
    } 

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

    public function createToken(Request $request, $username, $password, $providerKey) 
    { 
     return new UsernamePasswordToken($username, $password, $providerKey); 
    } 
} 

Я надеюсь, что этот ответ будет полезен кому-то еще ...