2013-03-07 1 views
5

Attualmente mi occupo del componente Sicurezza di Symfony2.Symfony2 autentica gli utenti tramite un webservice

Cerco di autenticare gli utenti contro un servizio web. Per autenticare un utente, devo fornire al webservice un nome utente e una password.

So che devo creare una classe che implementa UserProvider. Ma la funzione loadUserByUsername non si adatta alle mie esigenze di webservice: per autenticare un utente, richiede sia username che password mentre la funzione UserProvider richiede solo username.

Ecco una domanda simile al problema mi trovo di fronte: Symfony2 authentication without UserProvider

Ho lottato su questo problema per un paio di giorni ...

+1

La mia risposta alla domanda collegata è stata di aiuto? O ha solo confuso le cose? – Cerad

+2

Che tipo di webservice stai usando? Come vengono codificate le password? Forse devi creare un fornitore di autenticazione come descritto in http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html ... è un sacco di lavoro però! Controlla http://stackoverflow.com/questions/14928514/symfony2-authentication-via-3rd-party-rest-api/14947332#14947332 .. deve aiutarti a iniziare. – hacfi

+0

Grazie mille per entrambe le vostre risposte! Proverò a farlo come suggerito da @hacfi [qui] (http://stackoverflow.com/questions/14928514/symfony2-authentication-via-3rd-party-rest-api/14947332#14947332). – SupaCoco

risposta

0

Un modo per realizzare questo sarebbe quello di caricare il utente dal nome utente e quindi convalidare la password. Se esiste un utente per il nome utente specificato e la password immessa corrisponde alla password di tale utente, quindi autenticare l'utente. Esempio:

public function userLogin($username, $password) 
{ 
    $em = $this->getEntityManager(); 
    $query = $em->createQuery('SELECT u FROM VenomCoreBundle:User u WHERE u.username = :username OR u.email = :username AND u.isDeleted <> 1 ') 
      ->setParameter('username', $username); 
    try { 
     $entity = $query->getSingleResult(); 
     if (count($entity) > 0) { 
      $encoder = new MessageDigestPasswordEncoder('sha512', true, 10); 
      $passwordEnc = $encoder->encodePassword($password, $entity->getSalt()); 
      $userPassword = $entity->getPassword(); 

      if ($passwordEnc == $userPassword) { 
       $tokenValue = $entity->getUserToken(); 
       $profile = $entity->getUserProfile(); 
       if(!$profile) { 
        return false; 
       } 
       $userName = $profile->getFullName(); 



       $response = array(
        'token' => $tokenValue, 
        'username' => $userName 
       ); 
      } else { 
       return false; 
      } 
     } 
    } catch (\Doctrine\Orm\NoResultException $e) { 
     return false; 
    } 

    return $response; 
} 
2

ho risolto questo problema in questo modo:

services.yml:

services: 
    user_provider: 
     class: "%my_class%" 
     arguments: ["@service_container"] 

WebServiceUserProvider.php

/** 
* @param ContainerInterface $container 
*/ 
public function __construct(ContainerInterface $container) 
{ 
    $this->apiClient = $container->get('api_client'); 
    $this->request = $container->get('request'); 
} 

e utilizzare $password = $this->request->get('password'); nel metodo loadUserByUsername