Détails du sujet

Symfony 3 [Quiz 3] [Pile 4]

Sécurité et Services dans le FrameWork Symfony 3

Toutes les cartes

Sécurity - Commentez ces lignes situées dans app/config/security.yml
  • Ligne 03: On configure le bundle security
  • Ligne 04: On configure la partie access_control du bundle security
  • Ligne 05: Seul les utilisateurs qui ont le rôle ''ROLE_ADMIN'' peuvent accéder aux URL commencant par /admin

Sécurié - Commentez les lignes 7 à 12 du fichier app/config/security.yml
  • Ligne 07: Indique que la méthode d'authentification se fera par formulaire
  • Ligne 08: Indique la route ''login'' qui dirige vers le formulaire de connexion
  • Ligne 09: indique la route ''login_check'' qui dirige vers la validation du formulaire
  • Ligne 10: Section ''logout''
  • Ligne 11: Indique la route ''logout'' qui permet la déconnexion
  • Ligne 12: Indique l'URL vers laquelle on est redirigé aprés la déconnexion

Sécurité - Doit-on définir un contrôleur pour la route ''login_check''?
Non

Symfony gère lui même l'authentification du client après avoir attrapé la requête du client sur la route ''login_check''


Sécurité - Quelles sont les 3 routes que l'on doit définir dans routing.yml?
Dans app/config/routing.yml on doit définir les routes suivantes:
  • login
  • login_check
  • logout

Seule la route ''login'' doit définir une action de contrôleur pour obtenir le formulaire de d'authentification


Sécurité - Commentez ces lignes du fichier app/config/routing.yml
Ce sont les 3 routes à définir pour se loguer avec un formulaire
  • Ligne 04, la méthode loginAction() du contrôleur Security du bundle TotoSecurityBundle nous permet d'accéder au formulaire d'authentification.
  • Ligne 06 07: Cette route permet à Symfony d'authentifier l'authentification. L'Action du formulaire d'authentification doit contenir cette route ''login_check''.
  • Ligne 09 10: Cette route nous permet de nous déconnecter

Sécurité - Quelles URL sont concernées par ce pare-feu?

Toutes les URL sont concernées car il n'y a pas de pattern défini.


Sécurité

Quelles sont les lignes à écrire dans app/config/security.yml pour que toutes les URLs de notre site soient accessibles uniquement;

  • Via la fenêtre de login basique du serveur
  • Par l'utilisateur administrateur 'toto' avec le mot de passe '123' codé en clair en mémoire

Sécurité

Comment se déconnecter, lorsque l'on utilise l'option 'http_basic'' pour se connecter avec un login's name et un password?

  • Lorsqu'on utilise l'option 'http-basic'' du pare-feu d'authentification, il n'y a pas de manière de se déconnecter avec Symfony
  • La seule manière de se déconnecter et d'arrêter le browser d'envoyer à chaque requête le login's name et le password pour chaque requête
  • Effacer le cache du browser ou redémarrer le browser permet de se déconnecter

Sécurité

Quelle commande CLI (Command Line Interface) nous permet de coder notre mot de passe dans la section ''memory'' de notre fichier app/config/security.yml avec l'algorithme spécifié dans ce même fichier?

>php bin/console security:encode-password

Sécurité

Le bundle FOSUserBundle s'occupe-t-il de la sécurité?

Non

Il met à notre disposition un objet User avec des routes et des contrôleurs pour nous aider à se loguer, s'enregistrer, récupérer un nouveau mot de passe etc...


Sécurité

Quel bundle peut-on créer afin de gérer la sécurité de notre site?

Créer un UserBundle

>php bin/console generate:bundle


Sécurité

Dans quel répertoire de notre UserBundle nous recommande-t-on de sauver notre formulaire de login ''login.html.twig''?

UserBundle/Resources/views/Security/login.html.twig


Sécurité

Si l'on choisit de créer un formulaire de login ''login.html.twig'' dans notre UserBundle, quel est par défaut:

  1. La valeur de l'attribut ''action='' dans la balise <form>
  2. La valeur de l'attribut ''name='' pour le login's name
  3. La valeur de l'attribut ''name='' pour le password
  1. action=''{{ path('login_check') }}''
  2. name=''_username'' pour le login's name
  3. name=''_password'' pour le password

Sécurité

Quel est le code type pour l'action loginAction() de notre contrôleur qui gère le login de notre formulaire d'authentification?


Sécurité - Commentez cet action qui gère le formulaire de login
  • Ligne 03 04: Si le visiteur est déjà identifié, on le redirige vers l'accueil en utilisant le service ''security.authorisation_checker''
  • Ligne 08: Le service ''security.authentication_utils'' permet de récupérer le nom d'utilisateur et l'erreur dans le cas où le formulaire a déjà été soumis mais était invalide (mauvais mot de passe par exemple)
  • Ligne 09 11: Retour vers le formulaire avec les erreurs et l'ancien login's name s'ils existent

Sécurité

Quel est l'ID du service qui gère l'authorisation?

security.authorization_checker


Sécurité

Quel est le nom du service qui nous permet de récupérer les erreurs survenues pendant une mauvaise authentification avec formulaire?

security.authentication_utils


Sécurité

Quel est le nom du service qui nous permet de récupérer le login's name du formulaire d'authentification afin de le représenter dans le formulaire si l'authentification s'est mal passée?

Cela évite à l'utilisateur de retaper son login's name.

security.authentication_utils


Sécurité

Doit-on faire en sorte que l'URL /login requiert un rôle afin d'accéder à notre formulaire de d'authentification?

Non


Sécurité

L'URL /login_check doit-elle prise en compte par le pare-feu?

Oui


Sécurité

Si l'on est authentifié sur un pare-feu, l'est-on forcément sur un autre pare-feu?

Non

Les pare-feux ne partagent pas afin d'augmenter la sécurité lors de paramétrages complexes


Sécurité
  1. Quelles sont les 3 routes à définir si l'on crée un formulaire d'authentification?
  2. Quelle est la seule route parmis les 3 qui a besoin d'une action de contrôleur défine par nous?
  1. login, login_check, logout
  2. login

Sécurité - Dans un contrôleur ou un service

Que retourne $this->getUser() si le user est anonyme?

Null


Sécurité - Dans un contrôleur ou un service

Que retourne $this->getUser() si le user n'est pas anonyme?

Une instance de la classe User


Sécurité

Dans un template, comment accéder aux attributs d'un utilisateur définit par la classe User?

Via la variable globale ''app''

{{ app.user.nomAttribut }}


Sécurité

Dans un template que vaut {{ app.user }} si l'utilisateur est anonyme?

Null


Sécurité - Dans un contrôleur ou un service

Quelle méthode du service ''security.authorization_checker'' permet de vérifier qu'un utilisateur a le bon rôle?

La méthode isGranted()

$this->get('security.authorisation_checker) ->isGranted('ROLE_NomDuRôle')


Sécurité

La section ''role_hierarchy'' du fichier app/config/security.yml définit-elle l'exhaustivité des rôles?

Non

Elle définit la hierarchie des rôles.

D'autres rôles peuvent exister en dehors de cette section


Humour

Comment reconnaître une développeuse sexy?

C'est une développeuse qui possède un String dans l'Array.


Serveur PHP de Symfony

Quelle commande CLI (Command Line Interface) nous permet de lancer le serveur interne de Symfony?

 >php bin/console server:run


Serveur PHP de Symfony

Quel est l'avantage d'utiliser le serveur PHP de Symfony?

Cela permet de tester localement notre application Symfony sans avoir à installer et configurer un serveur Apache ou Nginx.


Serveur PHP de Symfony

Peut-on utiliser le serveur PHP de Symfony sur un ordinateur connecté au réseau internet public?

Non

On ne doit jamais lancer le serveur PHP Symfony si notre ordinateur est connecté à un reseau internet public.

On l'utilise dans un environnement controlé pour tester notre application en mode développement.


Sécurité

Quelle annotation ajouter à une action de contrôleur pour que seul les utilisateurs avec les rôles ROLE_X et ROLE_Y puissent la lancer?

@Security("has_role('ROLE_X') and has_role('ROLE_Y')'')


Sécurité - app/config/security.yml

Quelles lignes écrire dans la section ''access_control'' pour que seul les utilisateurs avec le rôle ROLE_X et l'ip 172.217.20.163 puissent accéder aux URL commençant par /toto avec le protocole https?

  • security:
  •     access_control:
  •         - { path: ^/toto, roles: ROLE_X, ip: 172.217.20.163, requires_channel: https }

Sécurité

Quelle interface doit implémenter notre classe User de notre bundle UserBundle afin d'être un utilisateur de la couche sécurité de Symfony?

L'Interface UserInterface
  • use Symfony\Component\Security\Core\User\UserInterface;
  • class User implements UserInterface
  • {...}

Sécurité

Comment savoir le nom des attributs à utiliser dans notre classe User de notre bundle UserBundle?

En regardant le contenu de l'interface UserInterface que notre classe User doit implémenter pour faire partie de la couche sécurité de Symfony?


Sécurité

Par défaut, d'où provient la classe User qui est utilisée pour l'authentification?

Symfony utilise par défaut la classe User située dans:

Symfony/Component/Security/Core/User/User.php

(cf. le fichier app/config/security.yml configuré par défaut avec cet utilisateur)


Sécurité

Quelles sont les étapes générales pour développer sa propre classe User dans son propre Bundle UserBundle avec un formulaire d'authentification et un user sauvegardé en base de données?

(Sans utiliser FosUserBundle ou tout autre bundle de gestion d'utilisateurs)

  1. Créer notre Bundle UserBundle: >php bin/console generate:bundle
  2. Créer notre classe User qui implémente l'interface UserInterface et la mapper pour en faire un entité Doctrine. >php bin/console doctrine:generate:entity
  3. Mettre à jour notre bdd: >php bin/console schema:update (--dump-sql puis --force)
  4. Développer nos actions de contrôleur pour gérer un User avec les templates associès (si on ne souhaite pas utiliser FosUserBundle ou tout autres Bundles de gestion de User)
  5. Renseigner le fichier app/config/security.yml
  6. Renseigner le fichier app/config/routing.yml  avec les 3 routes ''login'', ''login_check'' et ''logout''
  7. Sécuriser les templates, URL et les actions de contrôleur en fonction des rôles des utilisateurs

Sécurité

Citez les 3 fournisseurs d'utilisateurs (providers) utilisables dans la section ''providers'' du fichier app/config/security.yml

  1. ''memory'' - Le user est défini dans le fichier app/config/security.yml
  2. ''entity'' - Le user est défini par une entité Doctrine sauvegardée en BDD
  3. ''id'' - indique l'id du service de notre choix qui fournira l'utilisateur

Sécurité

Un fournisseur d'utilisateur (provider) est une classe qui doit implémenter qu'elle interface?

L'interface UserProviderInterface


Sécurité

Avec quelle méthode de l'interface UserProviderInterface, le provider va-t-il renvoyer au firewall un utilisateur en fonction de son username?

La méthode loadUserByUsername()

Sécurité - Commentez ces lignes du fichier app/config/security.yml
  • Ligne 01 02 : Configuration du provider du bundle SecurityBundle
  • Ligne 03: Nom ''main'' de notre provider
  • Ligne 04: Provider ''entity'' de Symfony choisi
  • Ligne 05: FQCN de la classe User qui a été mappée pour être une entité Doctrine
  • Ligne 06: Attribut ''username'' de la classe User qui contient le nom de l'utilisateur

Sécurité

Quelles lignes écrire dans app/config/security.yml pour indiquer que notre provider de nom ''main'' fait appel à une entité OC\UserBundle\Entity\User dont l'attribut ''username'' contient le nom de l'utilisateur?


Sécurité - Dans app/config/security.yml

Aprés avoir définit un nom de provider dans la section ''providers'' faut-il indiquer ce nom dans la section ''firewalls''?

Oui


Services

Quel est l'ID du service Doctrine (son alias) qui permet d'accéder à la base de données?

doctrine.orm.entity_manager


Services

Quel est l'ID du service (son alias) qui permet de faciliter l'envoi d'emails?

mailer


Services

Quel est l'ID du service qui permet d'accéder à une instance de twig_evironment et que l'on peut utiliser par exemple pour ajouter nos propres extensions?

twig


Services

Quel est l'ID du service qui permet d'accéder au contaîner de services lui-même avec tous les services qu'il contient?

service_container


Services

Quel est l'ID du service qui permet d'obtenir un objet contenant la requête courante?

request_stack


Services

Quel est l'ID du service qui permet d'accéder au routeur?

router