Compare commits

..

1 Commits

Author SHA1 Message Date
Thomas MONCHICOURT eadb2a397f Fix : probleme connexion apres login 2018-08-22 11:34:58 +02:00
2 changed files with 51 additions and 40 deletions
@@ -3,8 +3,8 @@ security:
in_memory:
memory: ~
fos_userbundle:
id: fos_user.user_provider.username_email
#id: app.user_provider
#id: fos_user.user_provider.username_email
id: app.user_provider
firewalls:
dev:
@@ -2,19 +2,11 @@
namespace AppBundle\Security\Core\User;
use FOS\UserBundle\Model\UserInterface as FOSUserInterface;
use AppBundle\Entity\Company;
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseFOSUBProvider;
use AppBundle\Entity\Company;
use AppBundle\Entity\Answer;
use AppBundle\Entity\Media;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Core\User\UserInterface;
class FOSUBUserProvider extends BaseFOSUBProvider
{
@@ -22,20 +14,19 @@ class FOSUBUserProvider extends BaseFOSUBProvider
public function __construct($userManager, $em, $slug, $container, array $properties)
{
parent::__construct($userManager,$properties);
parent::__construct($userManager, $properties);
$this->em = $em;
$this->slugService = $slug;
$this->container = $container;
}
/**
* {@inheritdoc}
*/
public function connect(UserInterface $user, UserResponseInterface $response)
{
$isTmpUser = false;
if($this->container->get('security.token_storage')->getToken()){
if ($this->container->get('security.token_storage')->getToken()) {
$userConnected = $this->container->get('security.token_storage')->getToken()->getUser();
if ($userConnected->hasRole('ROLE_TALENT_TMP')) {
$isTmpUser = true;
@@ -46,7 +37,7 @@ class FOSUBUserProvider extends BaseFOSUBProvider
$property = $this->getProperty($response);
$username = $response->getUsername(); // get the unique user identifier
$serviceName = $response->getResourceOwner()->getName();
$propertyQuery = str_replace('_', '', lcfirst(ucwords($property, '_')));
$propertyQuery = str_replace('_', '', lcfirst(ucwords($property, '_')));
$setter = 'set' . ucfirst($serviceName) . 'Id';
$setterToken = 'set' . ucfirst($serviceName) . 'AccessToken';
$existingUser = $this->userManager->findUserBy(array($propertyQuery => $username));
@@ -56,7 +47,7 @@ class FOSUBUserProvider extends BaseFOSUBProvider
}
if (null !== $existingUser) {
$this->disconnect($existingUser, $response);
if($isTmpUser){
if ($isTmpUser) {
$this->assignToRealAccount($userConnected, $existingUser);
$user = $existingUser;
$token = new UsernamePasswordToken($user, null, "main", $user->getRoles());
@@ -66,7 +57,7 @@ class FOSUBUserProvider extends BaseFOSUBProvider
$existingUser->$setterToken($response->getAccessToken());
$this->userManager->updateUser($existingUser);
} else {
if($isTmpUser){
if ($isTmpUser) {
$existingUser = $this->loadUserByOAuthUserResponse($response);
$this->assignToRealAccount($userConnected, $existingUser);
$existingUser->$setter($username);
@@ -81,9 +72,17 @@ class FOSUBUserProvider extends BaseFOSUBProvider
}
}
public function assignToRealAccount($userConnected, $existingUser) {
/**
* This function is meant to reassign data from a temporary account to a real account
*
* @param $userConnected
* @param $existingUser
* @return void
*/
public function assignToRealAccount($userConnected, $existingUser)
{
$answers = $this->em->getRepository('AppBundle:Answer')->findBy(array('user' => $userConnected));
$medias = $this->em->getRepository('AppBundle:Media')->findBy(array('creator'=> $userConnected));
$medias = $this->em->getRepository('AppBundle:Media')->findBy(array('creator' => $userConnected));
foreach ($medias as $key => $media) {
$media->setCreator($existingUser);
}
@@ -95,41 +94,54 @@ class FOSUBUserProvider extends BaseFOSUBProvider
$this->userManager->deleteUser($userConnected);
}
/**
* Load a user by username.
*
* @param string $username
*
* @return UserInterface|null
*/
public function loadUserByUsername($username)
{
$existingUser = $this->userManager->findUserByEmail($username);
if($this->container->get('security.token_storage')->getToken()){
$existingUser = $this->userManager->findUserByUsername($username);
if($existingUser == null){
$existingUser = $this->userManager->findUserByEmail($username);
}
//Used to assign data from temporry account to real account
if ($this->container->get('security.token_storage')->getToken()) {
$userConnected = $this->container->get('security.token_storage')->getToken()->getUser();
if ($userConnected->hasRole('ROLE_TALENT_TMP')) {
$this->assignToRealAccount($userConnected, $existingUser);
}
}
return $existingUser;
}
/**
* {@inheritDoc}
*/
* Used to create or load user when linkedin or Facebook Oauth is used
*
* @param UserResponseInterface $response
* @return $user
*/
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
{
$serviceName = $response->getResourceOwner()->getName();
$data = $response->getData();
$userConnected = null;
if($this->container->get('security.token_storage')->getToken()){
if ($this->container->get('security.token_storage')->getToken()) {
$userConnected = $this->container->get('security.token_storage')->getToken()->getUser();
}
$userEmail = $response->getEmail();
$user = $this->userManager->findUserByEmail($userEmail);
if($serviceName == "linkedin"){
if ($serviceName == "linkedin") {
$id = $data['id'];
$birthday = null;
$gender = null;
$userPhoto = $data['pictureUrls']['values'][0];
$username = $data['firstName']."-".$data['lastName'];
$username = $data['firstName'] . "-" . $data['lastName'];
$firstname = $data['firstName'];
$lastname = $data['lastName'];
@@ -150,9 +162,9 @@ class FOSUBUserProvider extends BaseFOSUBProvider
$lastname = $data['last_name'];
}
if (null === $user) {
if (null === $user) {
$user = $this->userManager->createUser();
$user->setUsername($firstname."-".$lastname);
$user->setUsername($firstname . "-" . $lastname);
$user->setFirstname($firstname);
$user->setLastname($lastname);
$user->setEmail($userEmail);
@@ -162,10 +174,10 @@ class FOSUBUserProvider extends BaseFOSUBProvider
$user->setRoles(array('ROLE_TALENT'));
$user->setBirthday($birthday);
$user->setGender($gender);
if($serviceName == "linkedin"){
if ($serviceName == "linkedin") {
$user->setLinkedinId($id);
}
if($serviceName == "facebook"){
if ($serviceName == "facebook") {
$user->setFacebookId($id);
}
$this->userManager->updateUser($user);
@@ -184,10 +196,10 @@ class FOSUBUserProvider extends BaseFOSUBProvider
return $user;
} else {
if($userConnected) {
if ($userConnected) {
$userConnected->hasRole('ROLE_TALENT_TMP');
if ($userConnected->hasRole('ROLE_TALENT_TMP')) {
$user->setUsername($firstname."-".$lastname);
$user->setUsername($firstname . "-" . $lastname);
$user->setFirstname($firstname);
$user->setLastname($lastname);
$user->setEmail($userEmail);
@@ -197,10 +209,10 @@ class FOSUBUserProvider extends BaseFOSUBProvider
$user->setRoles(array('ROLE_TALENT'));
$user->setBirthday($birthday);
$user->setGender($gender);
if($serviceName == "linkedin"){
if ($serviceName == "linkedin") {
$user->setLinkedinId($id);
}
if($serviceName == "facebook"){
if ($serviceName == "facebook") {
$user->setFacebookId($id);
}
$token = new UsernamePasswordToken($user, null, "main", $user->getRoles());
@@ -213,7 +225,6 @@ class FOSUBUserProvider extends BaseFOSUBProvider
$serviceName = $response->getResourceOwner()->getName();
$setter = 'set' . ucfirst($serviceName) . 'AccessToken';
$user->$setter($response->getAccessToken());
return $user;
return $user;
}
}