Symfony3 Перенаправить для регистрации, если пользователь передал GuardAuthenticator, но не существует в базе данных - PullRequest
0 голосов
/ 14 марта 2019

Я использую HWIOAuth для аутентификации пользователя с помощью учетной записи Google. Я также использую FOSUserBundle, чтобы разрешить аутентификацию с паролем и электронной почтой. Но я хочу перенаправить регистрационную форму или форму активации, если пользователь прошел аутентификацию в Google, но не существует в базе данных.

На самом деле, пользователи, прошедшие аутентификацию в Google, автоматически создавались в базе данных с FosUserProvider, но я не хочу этого делать.

use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;
use Symfony\Component\Security\Core\User\UserInterface;
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
class FOSUserProvider extends BaseClass 
{
/**
 * {@inheritDoc}
 */
public function connect(UserInterface $user, UserResponseInterface $response)
{
    $property = $this->getProperty($response);
    $username = $response->getUsername();
    //on connect - get the access token and the user ID
    $service = $response->getResourceOwner()->getName();
    $setter = 'set'.ucfirst($service);
    $setter_id = $setter.'Id';
    $setter_token = $setter.'AccessToken';
    //we "disconnect" previously connected users
    if (null !== $previousUser = $this->userManager->findUserBy(array($property => $username))) {
        $previousUser->$setter_id(null);
        $previousUser->$setter_token(null);
        $this->userManager->updateUser($previousUser);
    }
    //we connect current user
    $user->$setter_id($username);
    $user->$setter_token($response->getAccessToken());
    $this->userManager->updateUser($user);
}
/**
 * {@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($response->getEmail());
        $user->setFirstName($response->getFirstname());
        $user->setSurname($response->getLastName());
        $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());
    $user->setFirstName($response->getFirstname());
    $user->setSurname($response->getLastName());
    return $user;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...