2014-11-05 1 views
3

Я хочу написать функцию входа в систему через социальные сети.
Если пользователь не зарегистрирован, он сохраняется в базе данных, если пользователь существует, зарегистрируйте пользователя. Что мне следует писать в моем провайдере? Docs состояние:Как я могу написать поставщика услуг для HWIOAuthBundle

Расслоение нужен сервис, который способен загружать пользователей, основываясь на ответе пользователя на OAuth конечной точки. Если у вас есть пользовательская услуга, то должен реализовать интерфейс: HWI \ Bundle \ OAuthBundle \ Security \ Core \ User \ OAuthAwareUserProviderInterface.

Так это то, что я написал, а затем застрял

<?php 
namespace ng\MyBundle\Controller\Listeners; 

use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthAwareUserProviderInterface; 

class OAuthUserProvider implements OAuthAwareUserProviderInterface 
{ 

} 

Можете ли вы сказать мне, что методы, которые я должен использовать?
Может ли кто-нибудь дать мне пример поставщика, не используя FOSuserBundle?
Благодаря

+0

Я не знаю, если вы используете ФОС или нет, но это [суть] (https://gist.github.com/danvbe/4476697) имеет довольно-таки пример – stevenll

+0

Это моя проблема, я» m не использует FOSuserBundle .. Я сохраняю пользователей вручную – Sekai

+0

Интерфейс имеет только один метод, посмотрите на суть и вы можете создать собственную реализацию – stevenll

ответ

3

Если открыть OAuthAwareUserProviderInterface вы можете увидеть, что есть только один метод:

/** 
* Loads the user by a given UserResponseInterface object. 
* 
* @param UserResponseInterface $response 
* 
* @return UserInterface 
* 
* @throws UsernameNotFoundException if the user is not found 
*/ 
public function loadUserByOAuthUserResponse(UserResponseInterface $response); 

Ниже приведен пример того, как реализовать это, конечно, в вашем случае, вы должны позвонить своему лицо менеджеров и пользователей доступа, как вы его разработали.

/** 
* {@inheritdoc} 
*/ 
public function loadUserByOAuthUserResponse(UserResponseInterface $response) 
{ 
    $username = $response->getUsername(); 
    $user = $this->userManager->findUserBy(array($this->getProperty($response) => $username)); 
    //when the user is registrating 
    if (null === $user) { 
     $service = $response->getResourceOwner()->getName(); 
     $setter = 'set'.ucfirst($service); 
     $setter_id = $setter.'Id'; 
     $setter_token = $setter.'AccessToken'; 
     // create new user here 
     $user = $this->userManager->createUser(); 
     $user->$setter_id($username); 
     $user->$setter_token($response->getAccessToken()); 
     //I have set all requested data with the user's username 
     //modify here with relevant data 
     $user->setUsername($username); 
     $user->setEmail($username); 
     $user->setPassword($username); 
     $user->setEnabled(true); 
     $this->userManager->updateUser($user); 
     return $user; 
    } 

    //if user exists - go with the HWIOAuth way 
    $user = parent::loadUserByOAuthUserResponse($response); 

    $serviceName = $response->getResourceOwner()->getName(); 
    $setter = 'set' . ucfirst($serviceName) . 'AccessToken'; 

    //update access token 
    $user->$setter($response->getAccessToken()); 

    return $user; 
} 
+0

Я понял это! Все, что у меня есть сейчас, - это разработать мой класс для mongodb вместо mysql. – Sekai