FOSUserBundle: Comment gérer les utilisateurs avec Symfony2

Symfony2 logo

Introduction

Gérer les utilisateurs inscription, connexion, droits d’accès, etc.. a toujours été un plaisir avec symfony grâce aux plugins:

  • sfGuardPlugin (propel)
  • sfDoctrineGuardPlugin (doctrine)

Ce n’est pas bien plus dur avec Symfony2 ! Cela est même simplifié au maximum, bien que dépaysant au début. Le bundle FOSUserBundle répond aux mêmes problématiques mais fluidifie les choses, les rend plus intuitives.

FOSUserBundle : Installation

Il vous faut tout d’abord récupérer les sources du bundle et les placer dans le dossier vendor. Pour cela, 2 solutions s’offrent à vous :

1) Installation de FOSUSerBundle en clonant le dépôt git

$ git clone https://github.com/FriendsOfSymfony/FOSUserBundle.git vendor/bundles/FOS/UserBundle

2) Installation de FOSUSerBundle via les dépendances git

Ajoutez les lignes suivantes dans votre fichier deps :

[FOSUserBundle]
    git=git://github.com/FriendsOfSymfony/FOSUserBundle.git
    target=bundles/FOS/UserBundle

Puis mettez à jour les vendors :

$ php bin/vendors install

Cette solution a l’avantage de permettre à n’importe qui travaillant avec vous sur le projet de ne pas avoir à se soucier de quelles sont les vendors à installer et où les trouver. Il lui suffira de mettre à jour les vendors.

Une fois FOSUserBundle ajouté aux vendors, il vous faut l’activer dans le Kernel:

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new FOS\UserBundle\FOSUserBundle(),
    );
}

… Et ajouter le namespace qui va bien dans l’autoload:

<?php
// app/autoload.php

$loader->registerNamespaces(array(
    // ...
    'FOS' => __DIR__.'/../vendor/bundles',
));

Si vous avez encore des doutes sur l’utilité des namespaces ou que vous êtes sceptiques quant à son utilisation, je vous renvoie à ce très bon article de Pascal MARTIN sur le sujet.

Créer votre entity User en surchargeant l’utilisateur de FOSUserBundle

Pour hériter d’un bundle avec Symfony2, il suffit de définir le bundle parent dans votre classe :

<?php
// src/MyApp/UserBundle/MyAppUserBundle.php

namespace MyApp\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class MyAppUserBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

Votre UserBundle hérite maintenant de toutes les vues, actions…du bundle FOSUserBundle. Vous pouvez donc créer un nouvel utilisateur héritant de celui de base, tous les fonctionnalités de FOSUserBundle s’appliqueront à cet utilisateur :

<?php
// src/MyApp/UserBundle/Entity/User.php

namespace MyApp\UserBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

Configuration de FOSUserBundle

Il vous faut maintenant configurer le bundle. Pour cela, éditez votre fichier config.yml:

# app/config/config.yml
fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    # Permet de renseigner la nouvelle entity utilisateur
    user_class: MyApp\UserBundle\Entity\User

Votre bundle est désormais operationnel, vous pouvez mettre à jour votre base de données :

$ php app/console doctrine:schema:update --force

A ce stade là, vous devez normalement avoir une table fos_user dans votre base de données, et un dossier vendor/bundles/FOS/UserBundle contenant la hierarchie habituelle d’un bundle Symfony2.

Générez ensuite les getters et setters de votre nouvelle entity :

$ php app/console doctrine:generate:entities MyAppUserBundle:User

Vos entités sont operationnelles, il ne vous reste plus qu’à gérer vos formulaires. Tout d’abord, le formulaire utilisateur :

$ php app/console doctrine:generate:form MyAppUserBundle:User

Maintenant, en lançant la commande

$ php app/console

Vous avez désormais toute une floppée d’actions possibles grâce au bundle FOSUserBundle :

fos
  fos:user:activate                     Activate a user
  fos:user:change-password              Change the password of a user.
  fos:user:create                       Create a user.
  fos:user:deactivate                   Deactivate a user
  fos:user:demote                       Demote a user by removing a role
  fos:user:promote                      Promotes a user by adding a role

Un coup d’oeil à la suite de cet article vous permettra de faire un tour d’horizon rapide de ce bundle pour une utilisation optimale.

Ajoutez des champs à votre entity User

Vous souhaitez également que l’utilisateur renseigne nom, prénom, date de naissance, etc… lors de son inscription, que faire ?

Avec symfony 1.x, il fallait créer une nouvelle classe Profil qui était embarquée dans le formulaire de création d’un utilisateur.

Avec symfony2, nul besoin d’utiliser une logique aussi complexe que les formulaires embarqués. Il suffit de créer une nouvelle entity dans votre bundle qui héritera des attributs et mécanismes inhérents à l’utilisateur FOSUserBundle mais possédant également vos attributs. Pour fil conducteur nous allons ajouter ensemble un lieu d’habitat pour l’utilisateur. Pour cela, créez un nouveau bundle que vous appelerez UserBundle qui heritera de FOSUserBundle.

<?php
// src/MyApp/UserBundle/Entity/User.php

namespace MyApp\UserBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    // Ajoutez vos attributs ici, un attribut *location* de type *text* pour notre exemple :
    /**
     * @ORM\Column(type="text")
     */
    protected $location;

}

Il vous faut ensuite modifier le formulaire d’inscription. Pour cela il vous faut étendre celui de base fournis par le bundle FOSUserBundle en ajoutant vos champs personnalisés. Pour continuer sur notre exemple, voici comment ajouter notre fameux champ location :

<?php

namespace MyApp\UserBundle\Form\Type;

use Symfony\Component\Form\FormBuilder;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;

class RegistrationFormType extends BaseType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        parent::buildForm($builder, $options);

        // Ajoutez vos champs ici, revoilà notre champ *location* :
        $builder->add('location');
    }

    public function getName()
    {
        return 'myapp_user_registration';
    }
}

Il vous faut maintenant préciser à votre fichier de config quel formulaire utiliser pour l’inscription des utilisateurs :

# app/config/config.yml
fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    # Permet de renseigner la nouvelle entity utilisateur
    user_class: MyApp\UserBundle\Entity\User
    # Permet de renseigner le nouveau formulaire d'inscription
    registration:
    form:
        type: myapp_user_registration

Votre entity est désormais à jour. Vous pouvez désormais actualiser votre base de données, votre table fos_user contiendra vos nouveaux champs :

$ php app/console doctrine:schema:update --force

Base de données

Routing, actions et templates utilisés par FOSUserBundle

Vous devez en tout premier lieu importer toutes les routes du bundle :

# app/config/routing.yml
fos_user_security:
    resource: "@FOSUserBundle/Resources/config/routing/security.xml"

fos_user_profile:
    resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
    prefix: /profile

fos_user_register:
    resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
    prefix: /register

fos_user_resetting:
    resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
    prefix: /resetting

fos_user_change_password:
    resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
    prefix: /profile

Découvrons ensemble les routes que FOSUserBundle a généré pour nous en utilisant une commande Symfony2 listant les routes :

$ php app/console router:debug

Vous devriez voir apparaître (en plus de vos autres routes) les routes suivantes :

fos_user_security_login           ANY      /login
fos_user_security_check           ANY      /login_check
fos_user_security_logout          ANY      /logout
fos_user_profile_show             GET      /profile/
fos_user_profile_edit             ANY      /profile/edit
fos_user_registration_register    ANY      /register/
fos_user_registration_check_email GET      /register/check-email
fos_user_registration_confirm     GET      /register/confirm/{token}
fos_user_registration_confirmed   GET      /register/confirmed
fos_user_resetting_request        GET      /resetting/request
fos_user_resetting_send_email     POST     /resetting/send-email
fos_user_resetting_check_email    GET      /resetting/check-email
fos_user_resetting_reset          GET|POST /resetting/reset/{token}
fos_user_change_password          GET|POST /change-password/change-password

Vous avez également ces routes dans le routing interne à FOSUserBundle, où vous pouvez voir quelle est l’action cible de la route. Par exemple, pour la gestion des profils, jetons un coup d’oeil au fichier de routing :

<!-- vendor/bundles/FOS/UserBundle/Resources/config/routing/profile.xml -->
<routes xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
  <route id="fos_user_profile_show" pattern="/">
    <default key="_controller">FOSUserBundle:Profile:show</default>
    <requirement key="_method">GET</requirement>
  </route>
  <route id="fos_user_profile_edit" pattern="/edit">
    <default key="_controller">FOSUserBundle:Profile:edit</default>
  </route>
</routes>

Comme vous pouvez le remarquer, les fichiers de routing fournis par FOSUserBundle sont au format xml.

Gérer les droits d’accès des utilisateurs avec Symfony2

Tout est désormais fonctionnel, vous n’avez plus qu’à restreindre l’accès aux pages souhaitées. Cela se passe dans le fichier de configuration security.yml :

security:
    providers:
        fos_userbundle:
            id: fos_user.user_manager

    encoders:
        "FOS\UserBundle\Model\UserInterface": sha512

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:       true
            anonymous:    true

    # C'est ici que tout se passe : qui a accès à quoi ?
    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 }

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

La partie importante à bien comprendre est celle de l’access_control : Toutes les routes prefixées par /admin/ necessiteront le rôle ROLE_ADMIN,

Il vous suffit de préfixer les routes à protéger par /admin/ et le mécanisme de sécurité se mettra en oeuvre. Là ou il vous fallait faire un backend sécurisé et un frontend avec symfony 1.x, ou encore user du fichier security.yml pour une gestion plus fine des accès. Vous pouvez désormais gérer au cas par cas les espaces sécurisés simplement grâce à leurs routes !

Récupérer et utiliser l’utilisateur dans une action avec Symfony2

L’utilisateur est stocké en session, dans le contexte de l’application. Mais récupérer celui-ci sous forme d’objet dans une action peut vite devenir un casse-tête, bien que cela soit utile dans de nombreuses situations. Voici une bonne façon de faire :

$user = $this->container->get('security.context')->getToken()->getUser()

Vous pouvez ensuite manipuler cet objet comme bon vous semble et récupérer vos attributs nouvellement créés :

$user->getlocation()

Gérer l’utilisateur et ses droits d’accès dans un template twig avec Symfony2

Comment tester si l’utilisateur possède les bons droits d’accès dans un template avec Symfony2? Un jeu d’enfant avec twig ! En effet, twig dispose d’une kyrielle de fonctions de base :

{# L'utilisateur est-il connecté ? #}
{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}
    {# L'utilisateur est connecté ! #}
    <a href="{{ path('fos_user_security_logout') }}">Déconnexion</a>

    {# L'utilisateur est-il admin ? #}
    {% if is_granted('ROLE_ADMIN') %}
        {# L'utilisateur est admin ! #}
        <a href="{{ path('admin') }}">Administration</a>
    {% endif %}
{% else %}
    {# L'utilisateur n'est pas connecté ! #}
    <a href="{{ path('fos_user_security_login') }}">Connexion</a>
    <a href="{{ path('fos_user_registration_register') }}">Inscription</a>
{% endif %}

Twig vous permet également de récupérer l’utilisateur facilement :

{% if is_granted("ROLE") %}
    Bien le bonjour {{ app.user.username }} !
{% endif %}

Utilisez vos propres templates pour décorer FOSUserBundle

Pour utiliser vos templates, il va falloir surcharger les templates existant du bundle FOSUserBundle en respectant la hierarchie imposée par celui-ci. Pour notre exemple, nous allons modifier le template d’inscription d’un nouvel utilisateur. Pour respecter la hierarchie du bundle, créez un template register.html.twig dans un nouveau dossier Registration de votre UserBundle :

#src/MyApp/UserBundle/Resources/views/Registration/register.html.twig
{% extends "::base.html.twig" %}

{% block content %}
    <form action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register">
        {{ form_widget(form) }}
        <div>
            <input type="submit" value="{{ 'registration.submit'|trans({}, 'FOSUserBundle') }}" />
        </div>
    </form>
{% endblock %}

Le template d’inscription sera dorénavant décoré par le template de base. Ce mécanisme vous permet d’utiliser une des grandes forces de Twig: l’héritage de templates !

Envoyez un email de confirmation pour la création d’un utilisateur

Vous rêviez de pouvoir valider automatiquement vos utilisateurs en leur envoyant un email de confirmation avec un lien à cliquer pour valider ladite inscription ? FOSUSerBundle l’a fait !

En effet, il existe une fonctionnaltié toute prête permettant cet envoi d’email et validation de compte au-to-ma-tique. Cependant, celle-ci est désactivée par défaut. Pour l’activer,rien de plus simple :

# app/config/config.yml
fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    # Permet de renseigner la nouvelle entity utilisateur
    user_class: MyApp\UserBundle\Entity\User
    # Permet de définir quel service de mail utiliser
    # On utilise twig_swift pour pouvoir envoyer un email en HTML
    service:
        mailer: fos_user.mailer.twig_swift
    # Permet de renseigner le nouveau formulaire d'inscription
    registration:
        form:
            type: myapp_user_registration
        # Permet la validation automatique du compte par envoi d'un email
        confirmation:
            enabled:    true
            from_email:
                # Adresse de l'expediteur
                address:        noreply@monsiteweb.com
                # Nom de l'expediteur
                sender_name:    Admin de monsiteweb.com
        # Permet de définir le template de l'email à envoyer (en html)
        email:
            template: MyAppMonBundle:User:registration.email.twig

Il ne vous reste plus ensuite qu’à définir le template que vous souhaitez utiliser pour l’envoi d’email :

{# src/MyApp/MonBundle/Resources/views/User/registration.email.twig #}

{% block subject %}Confirmation d'inscription{% endblock %}

{% block body_text %}
{% autoescape false %}
Bonjour {{ user.username }} !

Vous devez confirmé voter inscription [....] en cliquant sur le lien suivant : {{ confirmationUrl }}

Amicalement,
Administrateur de monsiteweb.com
{% endautoescape %}
{% endblock %}

{% block body_html %}
{#
    Vous pouvez ici définir le HTML que vous souhaitez ou même utiliser la force de twig, à savoir l'inclusion de template : 
    include 'MyAppMonBundle:User:registration_email.html.twig'
#}
{% endblock %}

Utiliser la ligne de commande pour gérer vos utilisateurs avec FOSUserBundle

Le bundle FOSUSerBundle vous propose toute une kyrielle de commandes permettant de gérer vos utilisateurs :

1) Création & activation

$ php app/console fos:user:create monutilisateur test@example.com motdepasse
$ php app/console fos:user:activate monutilisateur
$ php app/console fos:user:deactivate monutilisateur

2) Gestion des rôles

$ php app/console fos:user:promote monutilisateur ROLE_ADMIN
$ php app/console fos:user:demote testuser ROLE_ADMIN

3) Changement de mot de passe

$ php app/console fos:user:change-password monutilisateur nouveaumotdepasse

Erreurs courantes avec FOSUserBundle

1) Problèmes de configuration de FOSUserBundle

Problème :

The child node "user_class" at path "fos_user" must be configured.
The child node "db_driver" at path "fos_user" must be configured.
The child node "firewall_name" at path "fos_user" must be configured.

Solution : Vous n’avez pas configuré l’un des éléments necessaire au bon fonctionnement de FOSUserBundle, à savoir :

fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    user_class: MyApp\UserBundle\Entity\User

Problème :

ErrorException: Warning: class_parents(): Class MyApp\Entity\User does not exist and could not be loaded in */vendor/doctrine/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php line 223

Solution : Vous avez mal configuré votre user_class dans app/config/config.yml. Vérifiez que votre namespace est bon, que votre classe se situe bien là ou vous l’avez définie.

2) Problèmes de surcharge de l’entity User de FOSUserBundle

Problème : Vous n’arrivez pas à surcharger le formulaire d’édition de profil de FOSUserBundle, rien à y faire vous avez cette erreur :

Neither property "username" nor method "getUsername()" nor method "isUsername()" exists in class "FOS\UserBundle\Form\Model\CheckPassword"

Solution : La surcharge du formulaire d’édition de profil de FOSUserBundle est un peu différente de celle du formulaire d’inscription. En effet, la fonction à surcharger dans le cas du formulaire d’inscription est buildForm(), or pour l’édition de profil, c’est la fonction buildUserForm() qu’il faut surcharger !

<?php
namespace MyApp\UserBundle\Form\Type;

use Symfony\Component\Form\FormBuilder;
use FOS\UserBundle\Form\Type\ProfileFormType as BaseType;

class ProfileFormType extends BaseType
{
    public function buildUserForm(FormBuilder $builder, array $options)
    {
        parent::buildUserForm($builder, $options);
        // On ajoute nos champs :
        $builder->add('location');
    }

    public function getName()
    {
        return 'myapp_user_profile';
    }
}

Conclusion

Symfony2 est amélioré par rapport à son predecesseur vieillissant. Là où symfony proposait un plugin agreable d’utilisation mais rendant les choses vite complexe pour une utilisation avancée, Symfony2 propose une approche plus pragmatique du problème : Faites ce que vous voulez, comme vous le voulez et où vous le voulez en héritant du bundle de base. Ce framework ainsi que ses bundles sont des outils de grande qualité ! N’hésitez pas à nous faire vos retours.

Si vous souhaitez une formation sur les frameworks symfony ou Symfony2 contactez-nous.

20 commentaires pour "FOSUserBundle: Comment gérer les utilisateurs avec Symfony2"

  • Par sbeex

    le 04/01/2012 @ 22:49

    Superbe cours ! Toutefois une légère incompréhension…

    « Il vous faut ensuite modifier le formulaire d’inscription. Pour cela il vous faut étendre celui de base fournis par le bundle FOSUserBundle en ajoutant vos champs personnalisés. Pour continuer sur notre exemple, voici comment ajouter notre fameux champ location »

    Ou se situe ce fameux fichier ? Ou dois-je le créer et avec quel nom dans le cas contraire ? Merci d’avance !

  • Par Pierre FERROLLIET

    le 05/01/2012 @ 08:42

    Salut, Ce formulaire personnalisé doit se situer dans ton bundle src\MonNamespace\UserBundle, dans le dossier Form\Type :

    namespace MonNamespace\UserBundle\Form\Type;

    Ton RegistrationFormType devra étendre celui existant dans FOSUerBundle, à savoir :

    FOS\UserBundle\Form\Type\RegistrationFormType

    D’où le code suivant :

    < ?php
    namespace MyApp\UserBundle\Form\Type;
    
    use Symfony\Component\Form\FormBuilder;
    use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;
    
    class RegistrationFormType extends BaseType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            parent::buildForm($builder, $options);
            // Ajoutez vos champs ici, revoilà notre champ *location* :
            $builder->add('location');
        }
        // ...
    }
    ?>
    

    Je vais très prochainement étoffer cette partie pour expliquer comment également surcharger la partie d’édition d’un profil de FOSUserBundle avec nos champs personnalisés ! En espérant avoir répondu à ta question !

    Bon courage

  • Par sbeex

    le 06/01/2012 @ 11:30

    Super merci beaucoup :) !

  • Par RM

    le 07/01/2012 @ 10:12

    Bon tuto… :)

    Dans les suites prévu, y aura-t-il une partie sur la validation des adresses mail à l’inscription (envoie de mail contenant un lien cliquable validant l’adresse email) ainsi que la validation de l’inscription par un administrateur??

    Merci d’avance :)

  • Par Gazelle

    le 11/01/2012 @ 14:54

    Bonjour,

    Merci pour ce tuto. Néanmoins, il manque quelque chose pour faire fonctionner le formulaire d’inscription. En effet, après avoir suivi le tuto, mon formulaire ne fonctionnait pas, il fallait rajouter ceci dans le fichier services.yml :

    src/MyApp/UserBundle/Resources/config/services.yml

    services:
        store_user.registration.form.type:
            class: MyApp\UserBundle\Form\Type\RegistrationFormType
            arguments: [%fos_user.model.user.class%]
            tags:
                - { name: form.type, alias: store_user_registration}
    

  • Par Pierre FERROLLIET

    le 15/01/2012 @ 09:26

    Bonjour,

    Ce tutoriel va être étoffé dans le courant de la semaine prochaine avec les améliorations suivantes :

    • Validation de l’inscription par son adrsse email
    • Validation de l’inscription par l’administrateur
    • Internationalisation des messages d’erreurs / ajout de nouveaux messages
    • Pouvoir se connecter grâce à son email et non son username

    Merci pour la remarque Gazelle, la précision sera également apportée prochainement ;)

  • Par Sakha

    le 19/01/2012 @ 14:40

    Bonjour à tous,

    J’ai un problème avec ton code Gazelle quand je rajoute le service pour faire fonctionner mon Type SF me répond :

    InvalidArgumentException: « ‘MyApp\UserBundle\Form\Type\RegistrationFormType’ » is not a valid class name for the « store_user.registration.form.type » service.

    J’ai essayé avec des / des // des \ et j’ai tenté de faire comme dans l’exemple du fichier services.yml avec des . mais rien ne passe, comment on l’écrit ce path ?

  • Par Pierre FERROLLIET

    le 19/01/2012 @ 14:48

    Salut,

    Voilà à quoi ressemble ce fichier :

    src/MyApp/UserBundle/Resources/config/services.yml
    services:
        store_user.registration.form.type:
            class: MyApp\UserBundle\Form\Type\RegistrationFormType
            arguments: [%fos_user.model.user.class%]
            tags:
                - { name: form.type, alias: store_user_registration}
         store_user.profile.form.type:
            class: MyApp\UserBundle\Form\Type\ProfileFormType
            arguments: [%fos_user.model.user.class%]
            tags:
                - { name: form.type, alias: store_user_profile}
    

    Il ne faut pas oublier de définir le formulaire pour l’édition de profil ! Bon courage, le tuto devrait de toute façon subir une refonte prochainement pour le rendre plus complet !

  • Par bechir

    le 24/01/2012 @ 13:34

    Merci pour cet tuto… je suis avec « RM » puisque j’ai le même problème Svp Pierre est ce qu’il y a des nouveautés suite a ce tuto Cordialement.

  • Par agence web

    le 25/01/2012 @ 12:40

    Merci pour le tuto et j’ai hâte de voir son évolution. Je conseils également la lecture de l’excellent tuto sur le même sujet qu’a rédigé le non moins excellente Winzou sur le site du zero: http://www.siteduzero.com/tutoriel-3-585282-securite-et-gestion-des-utilisateurs.html

  • Par sbeex

    le 06/02/2012 @ 09:06

    Salut Pierre, je n’arrive pas à faire valider mon formulaire d’inscription personnalisé ni à changer le template par défaut. Les champs pesonalisés s’ajoutent bien mais la mise en page spécifique que j’ai fait ne se fait pas…

    Ou en es-tu avec ton nouvel article sur le sujet ? ^^

  • Par Manga

    le 17/02/2012 @ 18:12

    Quand je clique sur le lien inscription j’obtient l’erreur suivante: Could not load type « store_user_registration » .A part ça le reste marche .aide SVP!

  • Par TontonCeCe

    le 22/02/2012 @ 20:53

    Merci pour ce cours , dans email.html.twig pourquoi un block textbody et un block html body? Htmlbody seul suffit non ? Cette partie est floue pour un débutant. Continuez comme ça :)

  • Par Pierre FERROLLIET

    le 24/02/2012 @ 09:17

    Salut,

    @sbeex, le tuto a été pas mal étoffé ces derniers temps, tu y as trouvé ton bonheur ?

    @Manga, c’est une erreur dans le tuto. Ca devrait plutot être tonnamespace_user_registration Par exemple, si ton application se nomme MaSuperAppli : masuperappli_user_registration

    @TontonCeCe Oui, htmlbody suffirait, mais pour un email ou il n’y aurait pas de html, donner un tel nom au block n’aurait pas de sens. Donc, oui dans l’absolu un seul block htmlbody suffirait pour un email full html. Pour un email contenant html + texte brut, faire 2 blocks c’est plus propres car permettant d’utiliser l’éhritage twig et d’hériter d’un tempalte html par exemple dans l’email ! :)

  • Par maclime

    le 24/02/2012 @ 09:27

    Bonjour, je commence sur symfony 2 et j’ai mis en place le fosuserbundle, c’est vraiment pratique mais sais-tu si il est possible de récupérer les rôles du hierarchy_role depuis une BDD car dans mon appli mes admins devrons pouvoir designer différents rôles pour un même utilisateur . J’espère que ma question est assez claire. En tout cas merci pour ton travail.

  • Par Yonl

    le 18/03/2012 @ 13:19

    Bonjour,

    J’obient une erreur : 500 Internal Server Error – ErrorException

    lorsque j’active la confirmation d’une inscription via mail.

    Je précises que je suis en local.

    Quelqu’un a une solution ?

  • Par Anis

    le 27/03/2012 @ 12:46

    Bonjour, Super Tuto, par contre je tiens à préciser pour l’envoie des mails de validations ‘FOSuser’ au niveau de config.yml pour pouvoir utiliser le template personnalisé, il faut supprimer le ligne email: , c’est tout Merci beaucoup pour ce Tuto qui m’a aider tant. Bonne continuation

  • Par Hich jackson

    le 30/03/2012 @ 12:44

    Bonjour, j’ ai bien suivi le tuot, et malheureusement j’ai le même problème que Manga, g crée les deux fichier RegistrationFormType et ProfileFormType comme il faut, ainssi g modifié le fichier de configuration comme ceci

    fos_user: db_driver: orm # Le type de BDD à utiliser, nous utilisons l’ORM Doctrine depuis le début firewall_name: main # Le nom du firewall duquel on utilisera ces utilisateurs user_class: Markup\UserBundle\Entity\User # La classe de l’entité User que nous venons de définir registration: form: type: markup_user_registration ou markup et mon namespace, et aussi j’ai modifié le fichier services.yml comme vous avez cité, j’ai toujours cette erreur: Could not load type « markup_user_registration » solutions? aides?

  • Par Chicna

    le 05/04/2012 @ 16:47

    Génial merci beaucoup pour ton aide, j’ai tout mis en place, ça marche du tonnerre. Mis à part quelques fioritures :

    Ce que je ne comprend pas c’est cette configuration :

    • { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
    • { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }

    Qui indique clairement que : « si toi connecté, toi pas pouvoir venir te loguer ». Alors qu’en fait on peut se loguer en étant déjà logué, avec cette configuration. Ce qui est apparemment normal d’après leur logique de hiérarchie. Le pire c’est que cette logique de « toi pas pouvoir te connecter 2 fois de suite » n’est pas incluse directement dans ce magnifique – il faut l’admettre – bundle. C’est dommage, mais bon, j’y survivrais.

    Autre problème – de taille cette fois, ce bundle ne gère pas les erreurs 403, enfin je crois. Si j’essaye d’accéder a une page ou il faut être connecté, je vais être redirigé vers la page de login si je ne suis pas connecté. Jusque la, ok. Mais il faut dire quelque chose à l’utilisateur, genre, « Tu n’as pas le droit d’accéder à cette page, il faut que tu te logues d’abord, ensuite on verra si tu as les droits ».

    En étant sur /login dans cette situation, je n’arrive pas à savoir, dans la vue, si je viens de me prendre une 403 ou si c’est le chargement normal de la page. Quelqu’un peut m’aider ? :D

  • Par Jean-Yves

    le 30/04/2012 @ 13:38

    Super tuto ! J’avais fait un break de 6 mois sur Symfony 1.4 et je vois que la V2 démarre sur les chapeaux de roues. Apparemment cela à l’air plus simple qu’avec sfGuard surtout lorsqu’on ajoute des champs de formulaires, une table en héritage, mais je n’ai pas encore essayé…

    A quand la suite avec la connexion avec les identifiants Facebook et l’inscription sur le site avec le profile FB pour enfin avoir une partie utilisateur digne de ce nom ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*