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 : 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
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
    <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 : 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;
    }
}
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
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.