2013-03-07 14 views
5

Obecnie zajmuję się komponentem bezpieczeństwa Symfony2.Symfony2 uwierzytelnianie użytkowników za pośrednictwem usługi internetowej

Próbuję uwierzytelniać użytkowników przeciwko serwisowi internetowemu. Aby uwierzytelnić użytkownika, muszę podać do usługi internetowej nazwę użytkownika i hasło.

Wiem, że muszę utworzyć klasę, która implementuje UserProvider. Ale funkcja loadUserByUsername nie pasuje do moich potrzeb webservice: w celu uwierzytelnienia użytkownika, prosi o podanie nazwy użytkownika i hasła, podczas gdy funkcja UserProvider wymaga tylko nazwy użytkownika.

Oto podobne pytanie do problemu I czołowa: Symfony2 authentication without UserProvider

byłem walczy na ten problem na kilka dni ...

+1

Czy moja odpowiedź na powiązane pytanie pomogła? A może po prostu myliło rzeczy? – Cerad

+2

Jakiego rodzaju usługi internetowej używasz? W jaki sposób są kodowane hasła? Być może musisz stworzyć dostawcę uwierzytelniania, jak opisano w http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html ... jednak jest dużo pracy! Sprawdź http://stackoverflow.com/questions/14928514/symfony2-authentication-via-3rd-party-rest-api/14947332#14947332 ..it powinien pomóc Ci zacząć. – hacfi

+0

Wielkie dzięki za obie odpowiedzi! Spróbuję zrobić to tak, jak zasugerowałem @hacfi [tutaj] (http://stackoverflow.com/questions/14928514/symfony2-authentication-via-3rd-party-rest-api/14947332#14947332). – SupaCoco

Odpowiedz

0

Jednym ze sposobów osiągnięcia tego byłoby załadować użytkownik po nazwie użytkownika, a następnie sprawdź hasło. Jeśli użytkownik istnieje dla podanej nazwy użytkownika, a wprowadzone hasło jest zgodne z hasłem tego użytkownika, uwierzytelnij użytkownika. Przykład:

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

naprawiłem ten problem w ten sposób:

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

i używać $password = $this->request->get('password'); w swojej metodzie loadUserByUsername

Powiązane problemy