FOSUserBundle : authentification et redirection vers page login.
Bonjour,
J'utilise le FOSUserBundle pour gérer mes utilisateurs mais j'ai un problème. L'utilisateur reçoit par mail un token qui leur permet d'aller sur une page pour définir son mot de passe. Malheureusement, l'utilisateur est systématiquement renvoyé vers la page de login.
Je ne comprends pas pourquoi.
Mon security.yml:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| security:
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
encoders:
FOS\UserBundle\Model\UserInterface: sha512
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
logout: true
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
- { path: ^/, role: ROLE_USER }
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN |
Mon routing pour les mots de passe dans UserBundle:
Code:
1 2 3 4 5 6 7 8 9
| <route id="fos_user_change_password" pattern="/change-password">
<default key="_controller">FOSUserBundle:ChangePassword:changePassword</default>
<requirement key="_method">GET|POST</requirement>
</route>
<route id="change_password_first" pattern="/create-password">
<default key="_controller">PortalUserBundle:ChangePassword:changePasswordFirst</default>
<requirement key="_method">GET|POST</requirement>
</route> |
Le UserBundle surcharge le RegistrationController du FOSUserBundle, plus précisément le confirmAction qui permet de renvoyer vers la page "création du mot de passe"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
namespace Portal\Bundle\UserBundle\Controller;
use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
use FOS\UserBundle\Model\UserInterface;
use FOS\UserBundle\Controller\RegistrationController as BaseController;
class RegistrationController extends BaseController
{
/**
* Receive the confirmation token from user email provider, login the user
*/
public function confirmAction($token)
{
$user = $this->container->get('fos_user.user_manager')->findUserByConfirmationToken($token);
if (null === $user) {
throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist', $token));
}
$user->setConfirmationToken(null);
$user->setEnabled(true);
$user->setLastLogin(new \DateTime());
$this->container->get('fos_user.user_manager')->updateUser($user);
$response = new RedirectResponse($this->container->get('router')->generate('change_password_first'));
$this->authenticateUser($user, $response);
return $response;
}
} |
Puis le controller qui permet de changer le mot de passe:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
/**
* Change user password at the first connection
*/
public function changePasswordFirstAction()
{
$user = $this->container->get('security.context')->getToken()->getUser();
if (!is_object($user) || !$user instanceof UserInterface) {
throw new AccessDeniedException('Accès interdit.');
}
$form = $this->container->get('fos_user.change_password.form');
$formHandler = $this->container->get('fos_user.change_password.form.handler');
$process = $formHandler->process($user);
if ($process) {
$this->setFlash('fos_user_success', 'change_password.flash.success');
$this->container->get('portal_front.mailer')->sendPasswordIsDefined();
return new RedirectResponse($this->getRedirectionUrl($user));
}
return $this->container->get('templating')->renderResponse(
'PortalUserBundle:ChangePassword:changePasswordFirst.html.'.$this->container->getParameter('fos_user.template.engine'),
array('form' => $form->createView())
);
}
/**
* Change user password
*/
public function changePasswordAction()
{
// pour activation : pas de mail envoyé au changement de mot de passe
// $this->client = new ClientMethodesProvider();
// $user = $this->get('security.context')->getToken()->getUser();
//$user_id = $user->getId();
//$de = $this->client->get('/de/'.$user_id);
// à enlever après fin test accès mail sur compte créé et 1er accès (statu compte : 0/1/2)
// => changement password, puis nouveau changement password
$user = $this->container->get('security.context')->getToken()->getUser();
if (!is_object($user) || !$user instanceof UserInterface) {
throw new AccessDeniedException('Accès interdit.');
}
$form = $this->container->get('fos_user.change_password.form');
$formHandler = $this->container->get('fos_user.change_password.form.handler');
$process = $formHandler->process($user);
if ($process) {
$this->setFlash('fos_user_success', 'change_password.flash.success');
return new RedirectResponse($this->getRedirectionUrl($user));
}
return $this->container->get('templating')->renderResponse(
'FOSUserBundle:ChangePassword:changePassword.html.'.$this->container->getParameter('fos_user.template.engine'),
array('form' => $form->createView())
);
}
/**
* Generate the redirection url when the resetting is completed.
*
* @param \FOS\UserBundle\Model\UserInterface $user
*
* @return string
*/
protected function getRedirectionUrl(UserInterface $user)
{
return $this->container->get('router')->generate('/');
}
/**
* @param string $action
* @param string $value
*/
protected function setFlash($action, $value)
{
$this->container->get('session')->getFlashBag()->set($action, $value);
}
} |
De ce que je vois, la fonction authenticateUser() permet à l'utilisateur d'être connecté (pour pouvoir accéder à la page de changement de mot de passe) MAIS cela ne se fait pas... d'ou la redirection vers la page de login.
Je ne comprends pas pourquoi, des idées? :)
Merci d'avance.