Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

code:php:symfony2:parametre [12/11/2015 20:48]
elisabeth [Login et accès au User]
code:php:symfony2:parametre [15/06/2018 22:22]
Ligne 1: Ligne 1:
-====== Paramètres ====== 
-===== config.yml ===== 
-''​%%app/​config/​config.yml%%''​ contient la configuration des différents services et bundles. ​ 
-La configuration est paramétrée via le fichier ''​%%parameters.yml%%'',​ on a donc  à priori peu de changements à y faire. 
-J'​ajoute ici les changements que j'ai déjà effectué. 
  
-==== Répertoire des sessions ==== 
-On peut changer le répertoire où sont enregistrées les sessions. (Ne pas oublier de mettre les bons droits sur le dossier ''​%%app/​sessions%%''​) 
-<​code>​ 
-framework: 
-    session: 
-        handler_id: session.handler.native_file 
-        save_path: "​%kernel.root_dir%/​sessions"​ 
-</​code>​ 
- 
-==== Enregistrement d'une commande ==== 
-On peut créer ses propres commandes en ligne ([[http://​symfony.com/​doc/​current/​cookbook/​console/​console_command.html]]). ​ 
-On peut les enregistrer comme service alors dans le fichier de configuration. 
-<​code>​ 
-services: 
-   ​app.command.my_command:​ 
-        class: MachinBundle\Command\MyCommand 
-        tags: 
-            -  { name: console.command } 
-</​code>​ 
-  
-==== Plusieurs bases de données ==== 
-On peut vouloir utiliser plusieurs bases de données. (Les valeurs des paramètres sont biensûr entrées dans ''​%%parameters.yml%%''​). 
-<​code>​ 
-# app/​config.yml 
-doctrine: 
-  dbal: 
-    default_connection:​ em1 # précise la connexion utilisée par défaut 
-    connections:​ 
-      em1: 
-        driver: ​  ​%database_driver% 
-        host:     ​%database_host% 
-        port:     ​%database_port% 
-        dbname: ​  ​%database_name1% 
-        user:     ​%database_user1% 
-        password: %database_password1% 
-        charset: ​ UTF8 
-      em2: 
-        driver: ​  ​%database_driver% 
-        host:     ​%database_host% 
-        port:     ​%database_port% 
-        dbname: ​  ​%database_name2% 
-        user:     ​%database_user2% 
-        password: %database_password2% 
-        charset: ​ UTF8 
-</​code>​ 
- 
-Et ensuite dans le controller on récupère le bon "​entityManager"​ dans le controller comme suit: 
-<code php> 
-    $em1 = $this->​get('​doctrine'​)->​getEntityManager('​em1'​);​ 
-</​code>​ 
-=====  parameters.yml ===== 
-<note warning>​Le fichier ''​%%app/​config/​parameters.yml%%''​ contient la valeur des paramètres définis dans ''​%%app/​config/​parameters.yml.dist%%''​. Lors d'un composer install ou update, le fichier ''​%%parameters.yml%%''​ est regénéré en faisant le diff entre la liste de paramètres dans les 2 fichiers. \\ 
-Il faut donc éditer en premier ​ ''​%%app/​config/​parameters.yml.dist%%''​ si on ajoute des paramètres!!</​note>​ 
-On peut enregistrer tous les paramètres souhaités, ainsi que des tableaux de paramètres. 
-<​code>​ 
-parameters: 
-    database_driver:​ pdo_mysql 
-    database_host:​ 127.0.0.1 
-    database_port:​ null 
-    database_name:​ test 
-    database_user:​ root 
-    database_password:​ null 
-    mailer_transport:​ smtp 
-    mailer_host:​ null 
-    mailer_user:​ null 
-    mailer_password:​ null 
-    locale: fr 
-    secret: ThisTokenIsNotSoSecretChangeIt 
-    debug_toolbar:​ true 
-    debug_redirects:​ false 
-    use_assetic_controller:​ true 
-    webmaster: moi-même 
-    options: 
-        name: 
-            required: false 
-            display: true 
-        surname: 
-            required: true 
-            display: true 
-</​code>​ 
- 
-Pour y accéder dans un controller : 
-<code php> 
-     ​$options = $this->​container->​getParameter('​options'​);​ 
-     //ou plus court 
-     ​$options = $this->​getParameter('​options'​);​ 
-</​code>​ 
-===== security.yml ===== 
-==== le fichier de configuration ==== 
- 
-C'est ici que l'on peut définir tous les paramètres de sécurité. Les rôles et qui à droit à quoi. Quel entité pour l'​authentification,​ Le cryptage... etc 
-voir aussi en plus long : [[http://​symfony.com/​doc/​current/​reference/​configuration/​security.html]] 
-<​code>​ 
-security: 
-    firewalls: 
-        secured_area:​ 
-            pattern: ​   ^/ 
-            anonymous: ~ 
-            http_basic: 
-                realm: "zone securisee"​ 
-            logout: 
-                path:   /​logout 
-                target: /login 
-            form_login: 
-                login_path: /login 
-                check_path: /logincheck 
-                # par défaut, le formulaire de login *doit* être un POST, 
-                # et pas un GET 
-                post_only: ​                     true 
- 
-                # options de redirection lorsque le login a réussi (vous 
-                # pouvez en lire plus ci-dessous) 
-                always_use_default_target_path:​ false 
-                default_target_path: ​           /​restricted/​ 
-                target_path_parameter: ​         _target_path 
-                use_referer: ​                   false 
- 
-                # options de redirection lorsque le login échoue (vous 
-                # pouvez en lire plus ci-dessous) 
-                failure_path: ​                  null 
-                failure_forward: ​               false 
- 
-                # noms des champs pour le nom d'​utilisateur et le mot 
-                # de passe 
-                username_parameter: ​            ​_username 
-                password_parameter: ​            ​_password 
-    role_hierarchy:​ 
-        ROLE_ADMIN: ROLE_CLIENT 
-        ROLE_SUPERADMIN:​ [ROLE_ADMIN,​ ROLE_ALLOWED_TO_SWITCH] 
-    access_control:​ 
-        - { path: ^/​restricted,​ roles: ROLE_ADMIN } 
-        - { path: ^/admin, roles: ROLE_SUPERADMIN } 
- 
-    providers: 
-        administrators:​ 
-            entity: { class: MachinTrucBundle:​Utilisateur,​ property: username } 
- 
-    encoders: 
-        Machin\TrucBundle\Entity\Utilisateur:​ 
-            algorithm: ​       sha1 
-            encode_as_base64:​ false 
-            iterations: ​      1 
-</​code>​ 
-<note warning>​Bien entendu, suppose qu'on a  
-    * une entité Utilisateur,​ avec username, password, roles... 
-    * une action ''​%%login%%''​ (accessible à tous dont l'url n'est pas du genre restricted/​login mais bien login). ​ 
-    * une action ''​%%logincheck%%'',​ en fait il faut juste une "​route"​ dans le fichier routing.yml 
-    * ''​%%logout%%''​ n'est pas nécesssaire. 
-    * et quelque part, une méthode pour créer ces utilisateurs. 
-</​note>​ 
-==== L'​entité nécessaire ==== 
- 
-L'​entité Utilisateur,​ on a forcément les propriétés username, password, salt, roles : 
-<code php> 
-namespace Machin\TrucBundle\Entity;​ 
- 
-use Doctrine\ORM\Mapping as ORM; 
- 
-use Symfony\Component\Security\Core\User\UserInterface;​ 
- 
-class Utilisateur implements UserInterface,​ \Serializable 
-{ 
-     ​private $username; 
-     ​private $password; 
-     ​private $salt; 
-     ​private $roles; 
-     ​private $isActive; 
-      
-     ... 
-    public function __construct() 
-    { 
-        $this->​isActive = true; 
-        //génère un grain de sel  
-        $this->​salt = md5(uniqid(null,​ true)); 
-    } 
-    public function getRoles() 
-    { 
-    $roles =array(); 
-    switch($this->​roles){ 
-    //les rôles suivants sont inclusifs 
-     case '​ROLE_SUPERADMIN':​ 
-         $roles[]='​ROLE_SUPERADMIN';​ 
-     case '​ROLE_ADMIN':​ 
- $roles[]='​ROLE_ADMIN';​ 
-     case '​ROLE_CLIENT':​ 
-         $roles[]='​ROLE_CLIENT';​ 
-         break; 
- } 
-    return $roles; 
-    } 
-    ​ 
-    public function serialize() 
-    { 
-       //​important pour les performances ​ 
-       ... 
-    } 
-    ​ 
-    public function unserialize() 
-    { 
-      ... 
-    } 
-} 
-</​code>​ 
-Voir aussi [[http://​symfony.com/​doc/​current/​cookbook/​security/​entity_provider.html]] 
-==== Login et accès au User ==== 
-=== Formulaire de login === 
- 
-<code php> 
-namespace Machin\TrucBundle\Controller;​ 
- 
-use Symfony\Bundle\FrameworkBundle\Controller\Controller;​ 
-use Symfony\Component\Security\Core\SecurityContext;​ 
-use Symfony\Component\Security\Core\Exception\AccessDeniedException;​ 
- 
- 
-class DefaultController extends Controller 
-{ 
- public function loginAction() 
-    { 
-        $request = $this->​getRequest();​ 
-        $session = $request->​getSession();​ 
-        //on récupère les erreurs de login 
-        if ($request->​attributes->​has(SecurityContext::​AUTHENTICATION_ERROR)) { 
-            $error = $request->​attributes->​get(SecurityContext::​AUTHENTICATION_ERROR);​ 
-        } else { 
-            $error = $session->​get(SecurityContext::​AUTHENTICATION_ERROR);​ 
-            $session->​remove(SecurityContext::​AUTHENTICATION_ERROR);​ 
-        } 
-        ​ 
-        return $this->​render('​MachinTrucBundle:​Default:​login.html.twig',​ array( 
-            '​last_pseudo'​ => $session->​get(SecurityContext::​LAST_USERNAME),​ 
-            '​error'​ => $error 
-        )); 
-    } 
-</​code>​ 
-=== Création d'un utilisateur === 
-On a intérêt à créer un premier utilisateur(SUPERADMIN) avant de restreindre les droits d'​accès. 
-<code php> 
-namespace Machin\AdminBundle\Controller;​ 
- 
-use Symfony\Bundle\FrameworkBundle\Controller\Controller;​ 
- 
-class GestionController extends Controller 
-{ 
-    public function AdduserAction(Request $request) 
-    { 
-        //Création d'un utilisateur 
-        $utilisateur = new Operateur();​ 
- //Creation du formulaire ​ (suppose qu'on a créé une class UtilisateurType 
- $form = $this->​get('​form.factory'​)->​create(new UtilisateurType(),​ $utilisateur);​ 
-        ​ 
-        // On fait le lien Requête <-> Formulaire (C'est ce qui est très bizarre!!) 
-        // À partir de maintenant, l'​objet $utilisateur contient les valeurs entrées dans le formulaire. 
-        $form->​handleRequest($request);​ 
-        if ($form->​isValid()) { 
-              // On l'​enregistre notre objet $utilisateur dans la base de données 
-              $factory = $this->​get('​security.encoder_factory'​);​ 
-              $salt =  md5(uniqid(null,​ true)); 
-       $utilisateur->​setSalt($salt);​ 
-       $encoder = $factory->​getEncoder($utilisateur);​ 
-       $password = $utilisateur->​getPassword();​ 
-       $password = $encoder->​encodePassword($password,​ $salt); 
-       $utilisateur->​setPassword($password);​ 
-              $em->​persist($utilisateur);​ 
-              $em->​flush();​ 
-              //on redirige 
-              return $this->​redirect($this->​generateUrl('​machin_admin_utilisateur'​));​ 
-        } 
-        //sinon on affiche le formulaire 
-        return $this->​render('​MachinAdminBundle:​Gestion:​adduser.html.twig'​);​ 
-    } 
-} 
-</​code>​ 
-=== Accès au user === 
- 
-<code php> 
-    // Dans un controller 
-    // Pour récupérer les données de l'​utilisateur authentifié 
-    $user = $this->​get('​security.context'​)->​getToken()->​getUser();​ 
-    //ou en plus court 
-    $user = $this->​getUser();​ 
-</​code>​ 
-<code twig> 
-    # dans une template ​ 
-    {{ app.security.getToken().getUser().getUsername() }} 
-    # en plus court 
-    {{ app.user.username}} 
- 
-</​code>​ 
-[[code:​php:​symfony2:​update|Suite - Librairie et Mises à jour]]