Détails du sujet

Symfony 3 [Quiz 3] [Pile 3]

Validation et Sécurité dans le FrameWork Symfony 3

Toutes les cartes

Validation

Dans une classe, quelle annotation DockBlock doit-on ajouter à un attribut pour contraindre sa valeur à être d'une longueur d'au moins 10 caratères et obtenir le message d'erreur ''Oups 10 caractères minimum'' en cas d'invalidité?

@Assert\Length(min=10, minMessage="Oups {{ limit }} caractères minimum")


Validation - Peut-on avoir plusieurs contraintes pour un même attribut?

Oui


Validation - Que représente ''min'' pour la contrainte ''Length''?

''min'' est une option de la contrainte ''Length''


Validation

Est-ce que toutes les contraintes possèdent l'option ''message'' afin de définir notre propre message en cas d'invalidité?

Oui


Validation

Dans notre contrôleur quelle méthode du formulaire fera appel au composant ''Validator'' de Symfony pour valider l'objet hydraté par le formulaire?

C'est la méthode handleRequest()
  • $form->handleRequest($request)->isValid()

Ce n'est pas la méthode ''isValid()'' qui elle compte le nombre d'erreur et retourne false s'il y a au moins une erreur.


Validation

Pourquoi lors de la validation des formulaires on se sert nous même que trés peu du service Validator?

Car le formulaire le fait à notre place avec la mèthode ''handleRequest'' qui va elle même faire appel au service validator.

 

$form->handleRequest($request)->isValid()


Validation

Dans une classe, les contraintes que l'on pose dans les annotations d'attributs sont-elle sensibles à la casse?

Oui

Il faut bien faire la différence entre minuscules et majuscules


Validation

Peut-on valider un objet indépendamment d'un formulaire?

Si oui, quelle méthode du service Validator doit-on utiliser dans un contrôleur?

Oui, la mèthode validate()

Validation - Commentez ce code situé dans une classe
  • On pose une contrainte en annotation du getter de type isNomDeLattribut
  • La valeur de l'attribut $advert sera valide s'il compte au moins 1 caractère
  • Il faut que la méthode isAdvertValid() retoune true pour que l'attribut soit valide

Validation - Commentez ce code situé dans une classe
  • On pose une contrainte en annotation du getter de type getNomDeLattribut
  • La valeur de l'attribut $content sera valide s'il compte au moins 10 caractères

Validation

Quelle annotation utilise-t-on sur une instance d'une classe B qui est utilisée dans une classe A, afin que les règles de validations de la classe B puissent s'appliquer?

On utilise l'annotation @AssertValid()

Validation

Peut-on valider les attributs d'une classe avec une contrainte Callback?

Oui


Validation

Quel est l'avantage des contraintes Callback?

  1. On peut créer nos propres règles de validation
  2. On peut ajouter plusieurs erreurs de validation à la fois et les assigner à des attributs spécifiques à la classe

Validation - Commentez ces lignes de code
Contrainte Callback
  • Ligne 6: Ajout d'une contrainte callback sur la méthode isContentValid()
  • Ligne 10: Si la valeur de l'attribut contenu n'a pas au moins un caractère alors on construit notre message en ligne 13 puis on l'attache au champs 'content' en ligne 14 pour enfin déclencher l'invalidité en ligne 15.
  • Le tout en utilisant les méthodes de la classe ExecutionContextInterface déclarée en ligne 2

Validation

Peut-on faire en sorte que l'attribut d'une entité soit unique parmi toutes les autres entités existantes?

Oui


Validation

Que doit-on faire pour que l'attribut d'une entité soit unique parmi toutes les autres entités existantes?

  • 1-Utiliser la classe UniqueEntity use Symfony\Bridge\Doctrine\Validation\Constraints\UniqueEntity
  • 2-Positionner la contrainte @UniqueEntity sur la classe elle même
  • 3-Utiliser l'option fields pour indiquer l'attribut que l'on souhaite unique
  • 4-Utiliser l'option message pour personnaliser le message d'erreur

Validation - Commentez ces lignes
Contrainte Unique
  • Ligne 6: On pose une contrainte @UniqueEntity dans l'annotation de la classe afin que la valeur de son attribut ''title'' soit unique parmi toutes les autres entités Doctrine. L'Options ''fields'' définit l'attribut et l'option ''message'' définit notre propre message d'erreur
  • Ligne 2: On utilise la classe UniqueEntity du Bridge Symfony qui fait le lien entre les bibliothèques Doctrine et Symfony.

Validation

Symfony nous permet-il de créer nos propres classes de contraintes?

Oui


Validation
  • Quelles sont les étapes pour créer sa propre classe de contrainte ''Toto'' que l'on posera dans une annotation sous la forme @Toto(message=''Message Personnalisé'') ?
  • ''message'' sera l'option de notre contrainte Toto.
  1. On crée la classe Toto dans le répertoire Validator de notre Bundle
  2. La classe Toto extends la classe Constraint qu'elle utilise avec: use Symfony\Component\Validator\Constraint;
  3. On annote la classe Toto avec @Annotation pour que cette classe soit disponible via les annotations dans les autres classes.
  4. Dans la classe Toto, on crée un attribut public $message qui contient le message par défaut, car l'option ''message'' de l'annotation correspond à un attribut public de la classe Toto.

Validation - Commentez ces lignes
Création de la contrainte @Toto(message=''Message Personnalisé'')
  • Classe Toto dans le répertoire Validator de notre CoreBundle, extends la classe Constraint
  • On annote la classe Toto avec @Annotation pour que cette classe soit disponible via les annotations dans les autres classes.
  • Dans la classe Toto, on crée un attribut public $message qui contient notre message par défaut, car l'option ''message'' de l'annotation correspond à un attribut public de la classe Toto
  • Cette contrainte sera  validée par défaut par la classe TotoValidator.php

Validation

Si l'on crée notre propre contrainte avec la classe Toto.php, quel devrait-être le nom par défaut de son validateur?

TotoValidator.php


Validation
  • Quelles sont les étapes pour créer la classe validateur qui validera notre propre classe de contrainte Toto.php?
  • Notre contrainte Toto est de la forme:

@Toto(message=''Message Personnalisé'') ?

  1. On crée la classe TotoValidator dans le répertoire Validator de notre Bundle qui utilise: use Symfony\Component\Validator\Constraint et use Symfony\Component\Validator\ConstraintValidator
  2. La classe TotoValidator extends la classe ConstraintValidator
  3. Dans la classe TotoValidator, on crée la fonction publique validate($value, Constraint $constraint)
  4. La méthode validate évalue la valeur de l'attribut avec notre propre règle et ajoute une violation si elle n'est pas valide avec $this->context->addViolation($constraint->message);

Validation - Que fait ce code situé dans une classe Validator?

Il permet d'ajouter un paramètre %string% dans le message d'erreur.

Par exemple : "Message %string% trop court!"


Validation

Peut-on transformer en service une classe de validation que l'on a créée?

Oui


Validation
  • Quelles sont les étapes pour créer sa propre classe de contrainte ''Toto'' que l'on posera dans une annotation sous la forme @Toto(message=''Message Personnalisé'') et qui sera validée par un service de validation?
  • ''message'' sera l'option de notre contrainte Toto.
  1. On crée la classe Toto dans le répertoire Validator de notre Bundle
  2. La classe Toto extends la classe Constraint qu'elle utilise avec: use Symfony\Component\Validator\Constraint
  3. On annote la classe Toto avec @Annotation pour que cette classe soit disponible via les annotations dans les autres classes.
  4. Dans la classe Toto, on crée un attribut public $message qui contient le message par défaut, car l'option ''message'' de l'annotation Toto correspond à un attribut public de la classe Toto.
  5. Dans la classe Toto on ajoute la fonction publique validateBy() qui retourne l'alias du service validateur

Validation - Commentez ces lignes
Création de la contrainte @Toto(message=''Message Personnalisé'')
  • On crée la classe Toto dans le répertoire Validator de notre Bundle
  • On fait en sorte que la classe Toto extends la classe Constraint que l'on ''use'' au préalable
  • On annote la classe Toto avec @Annotation pour que cette classe soit disponible via les annotations dans les autres classes.
  • Dans la classe Toto, on crée un attribut public $message qui contient le message par défaut, car l'option ''message'' de l'annotation Toto correspond à un attribut public de la classe Toto.
  • Dans la classe Toto on ajoute la fonction publique validateBy() qui retourne l'alias du service validateur

Validation

Quel est l'intérêt de transformer une classe valideuse en service?

Dans le cas où pour valider on ait besoin d'autres informations.

On peut par exemple lui injecter des services comme

  • La requête pour connaître l'ip du client

ou

  • L'entité manager pour connaître la valeur d'une entité

Commentez ces lignes
Transformation d'un validateur en Service
  • Ligne 1: Commentaire indiquant le chemin du fichier
  • Ligne 2: Début de la section qui liste les services
  • Ligne 3: Nom du service
  • Ligne 4: FQCN (Fully Qualified Class Name) de la classe valideuse que l'on transforme en service
  • Ligne 6: core_antimessagetropcourt est l'alias du nom du service qui sera utilisé et retourné par la méthode validatedBy() de la classe de contrainte Toto.php

Sécurité

Quelle est la différence entre l'Autorisation et l'Authentification?

  • L'Authentification définit qui est l'utilisateur
  • L'Autorisation définit si l'utilisateur à accès à la ressource demandée

Sécurité

Quels sont les deux états d'Authentification d'un client?

  1. Soit le client est authentifié via un formulaire d'authentification ou par un cookie
  2. Soit le client n'est pas authentifié via un formulaire et est donc considéré comme anonyme (mais techniquement Symfony l'authentifie comme anonyme)

Sécurité
  1. Qui gère l'Authentification?
  2. Qui gère l'Autorisation?
  1. Le Pare-feu (Firewall) gère l'Authentification
  2. Le Contrôleur d'Accès (Access Control) gère l'Autorisation

Sécurité

Quelles sont les étapes d'Authentification et d'Autorisation qui se répètent toujours lorsqu'un utilisateur souhaite accéder à une ressource internet?


Sécurité

Citez quelques moyens possibles pour s'authentifier?

  • Un formulaire de connexion classique
  • Via Facebook, Google, LinkedIn etc...
  • Via un certificat X.509
  • etc...

Sécurité

Quel fichier permet de configurer la sécurité dans Symfony?

Le fichier:

app/config/security.yml


Sécurité

Citez les sections situées dans le fichier de configuration:

app/config/security.yml

  • firewalls, providers, encoders, role_hierarchy, access_control
  • acl, access_denied_url, session_fixation_strategy, hide_user_not_found, always_authenticate_before_granting, erase_credentials, access_decision_manager

Sécurité

Quel Bundle de Symfony est paramétré via le fichier:

app/config/security.yml?

SecurityBundle


Sécurité

Que fait la section ''encoders'' dans le fichier:

app/config/security.yml

?

  • Cette section permet de choisir l'encoder (plaintext, sha512, bcrypt ...) qui sera appliqué sur le mot de passe de l'utilisateur.

Sécurité

Que fait la section ''role_hierarchy'' dans le fichier:

app/config/security.yml

?

  • Cette section définie la hierarchie des rôles.
  • C'est à dire si un rôle A est compris ou non dans un rôle B.

Sécurité

Quel est le préfixe que tout nom de rôle doit utiliser?

Le préfixe ROLE_


Sécurité

Le rôle d'un administrateur est-il toujours:

ROLE_ADMIN

Non

Le rôle peut être ROLE_TOTO ou tout autre chose du moment qu'il commence par:

ROLE_

et que les règles de sécurités associées à ce rôle soient celles d'un administrateur.


Sécurité - Commentez ces lignes situées dans app/config/security.yml
security.yml est le fichier de configuration du bundle securityBundle
  • Ligne 01: On configure le bundle security
  • Ligne 02: On configure la partie encoders du bundle security
  • Ligne 03: On définit l'encoder 'plaintext' pour coder le mot de passe de l'utilisateur. Cet encoder laisse en clair le mot de passe.

Sécurité

Que fait la section ''providers'' dans le fichier:

app/config/security.yml

?

  • Cette section permet de choisir son provider
  • Un provider est un fournisseur d'utilisateurs
  • Les utilisateurs sont récupérés depuis la mémoire ou une base de données ou d'autre part selon notre choix

Sécurité

Que fait la section ''firewalls'' dans le fichier:

app/config/security.yml

?

  • Cette section permet de configurer comment l'utilisateur sera authentifié.
  • Elle permet, entre autres, de désactiver la sécurité sur certaines URL

Sécurité

Combien de pare-feux peuvent agir sur une URL?

Un seul pare-feu


Sécurité

Que fait la section ''access_control'' dans le fichier:

app/config/security.yml

?

  • Cette section determine si l'utilisateur à les bons droits (rôles) pour accéder à la resource demandée.

Sécurité

Quels sont les 4 moyens de tester les rôles des utilisateurs pour accéder à une resource?

  1. La section ''access_control'' du fichier app/config/security.yml
  2. Les annotations des méthodes de contrôleurs: @Security("has_role('ROLE_X')")
  3. La fonction Twig is_granted('ROLE_X') dans un template
  4. La méthode isGranted() du service ''security.authorization_checker'' $this->get('security.authorization_checker')->isGranted('ROLE_X')

Sécurité - Commentez ces lignes situées dans app/config/security.yml
  • Ligne 01: On configure le bundle security
  • Ligne 02: On configure la partie role_hierarchy du bundle security
  • Ligne 03: L'Utilisateur qui a le rôle ''ROLE_ADMIN'' a accés à ce qu'accède l'utilisateur qui à le rôle ''ROLE_USER''
  • Ligne 04: L'Utilisateur qui a le rôle ''ROLE_SUPER_ADMIN'' a accès à ce qu'accèdent les utilisateurs qui ont le rôle ''ROLE_USER'' ou ''ROLE_ADMIN''

Sécurité - Commentez ces lignes situées dans app/config/security.yml
  • Ligne 01: On configure le bundle security
  • Ligne 02: On configure la partie access_control du bundle security
  • Ligne 03: toto est le nom arbitraire choisi pour définir le nom du firewall unique
  • Ligne 04: Expression régulière qui définit pour quelles url le firewall toto doit être activé
  • Ligne 05: On accèpte les utilisateurs anonymes pour les URL qui commencent par /content

Sécurité

Comment écrire notre pare-feu ''toto'' dans app/config/security.yml pour que les utilisateurs anonymes puissent accéder à toutes nos URL?


Sécurité

Dans le fichier app/config/security.yml comment créer un pare-feu ''toto'' qui désactive la sécurité pour toutes les URL qui commencent par /web/css?