2013-03-07 8 views
5

私は現在Symfony2のセキュリティコンポーネントを扱っています。Symfony2はWebサービスを通じてユーザーを認証します

私はウェブサービスに対してユーザーを認証しようとします。ユーザーを認証するには、ユーザー名とパスワードをWebサービスに提供する必要があります。

私はUserProviderを実装するクラスを作成しなければならないことを知っています。しかし、loadUserByUsername関数は私のWebサービスのニーズに合っていません。ユーザーを認証するために、UserProviderの関数はユーザー名だけを必要とするのに対し、ユーザー名とパスワードの両方を求めます。ここで

は、私が直面している問題に類似質問です:Symfony2 authentication without UserProvider

私は数日間、この問題で苦労してきた...これを達成する

+1

リンクされた質問に対する私の回答は何か助けになりましたか?それとも、物事を混乱させるだけでしたか? – Cerad

+2

どのようなWebサービスを使用していますか?パスワードはどのようにコード化されていますか?おそらく、http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.htmlに記載されているように、認証プロバイダを作成する必要があります。 http://stackoverflow.com/questions/14928514/symfony2-authentication-via-3rd-party-rest-api/14947332#14947332を参照してください。開始に役立つはずです。 – hacfi

+0

お返事ありがとうございました! @hacfiが[ここ](http://stackoverflow.com/questions/14928514/symfony2-authentication-via-3rd-party-rest-api/14947332#14947332)を示唆したようにそれをやろうとします。 – SupaCoco

答えて

0

一つの方法は、ロードすることですパスワードを確認してください。入力したユーザ名にユーザが存在し、入力されたパスワードがそのユーザのパスワードと一致する場合は、ユーザを認証します。 例:

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

私はそのようにこの問題を修正:

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

とあなたのloadUserByUsername方法で$password = $this->request->get('password');を使用します

関連する問題