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:
Mon routing pour les mots de passe dans UserBundle:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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>
Puis le controller qui permet de changer le mot de passe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } }
Je ne comprends pas pourquoi, des idées?
Merci d'avance.
Partager