2013-03-07 10 views
5

Ich bin derzeit mit Symfony2 Security-Komponente beschäftigt.Symfony2 authentifiziert Benutzer über einen Webservice

Ich versuche, Benutzer gegen einen Webservice zu authentifizieren. Um einen Benutzer zu authentifizieren, muss ich dem Webservice einen Benutzernamen und ein Passwort mitteilen.

Ich weiß, dass ich eine Klasse erstellen muss, die UserProvider implementiert. Die Funktion loadUserByUsername passt jedoch nicht zu meinen Webservice-Anforderungen: Um einen Benutzer zu authentifizieren, werden sowohl Benutzername als auch Passwort verlangt, während die Funktion des UserProvider nur den Benutzernamen benötigt.

Hier ist eine ähnliche Frage an das Problem, das ich konfrontiert: Symfony2 authentication without UserProvider

Ich habe seit ein paar Tagen ...

+1

Hat meine Antwort auf die verknüpfte Frage geholfen? Oder hat es nur Dinge verwirrt? – Cerad

+2

Welchen Webservice verwenden Sie? Wie sind die Passwörter verschlüsselt? Vielleicht müssen Sie einen Authentifizierungsanbieter wie in http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html beschrieben erstellen ... es ist jedoch eine Menge Arbeit! Check out http://stackoverflow.com/questions/14928514/symfony2-authentication-via-3rd-party-rest-api/14947332#14947332 ..es sollte Ihnen helfen, zu beginnen. – hacfi

+0

Vielen Dank für Ihre Antwort! Ich werde versuchen, es zu tun, wie @hacfi vorgeschlagen [hier] (http://stackoverflow.com/questions/14928514/symfony2-authentication-via-3rd-party-rest-api/14947332#14947332). – SupaCoco

Antwort

0

Eine Möglichkeit, dies zu erreichen, die zu laden wäre zu diesem Problem zu kämpfen Benutzer mit dem Benutzernamen und dann das Passwort bestätigen. Wenn ein Benutzer für den angegebenen Benutzernamen existiert und das eingegebene Passwort mit dem Passwort dieses Benutzers übereinstimmt, authentifizieren Sie den Benutzer. Beispiel:

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

fixierte ich dieses Problem auf diese Weise:

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'); 
} 

und $password = $this->request->get('password'); in Ihrer loadUserByUsername Methode verwenden

Verwandte Themen