Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Guard dans la vraie vie

Guard dans la vraie vie

SymfonyLive Paris 2016

Avatar for Jérémy Romey

Jérémy Romey

April 07, 2016
Tweet

More Decks by Jérémy Romey

Other Decks in Programming

Transcript

  1. @jeremyFreeAgent Tony Danza @ . PHP Symfony Lean Startup Scrum

    ☀ From Marseille, lives in Paris ❤ Restaurants Meet new people Je n’ai pas de chat mais j’ai un BB-8 — Il n’a ni Twitter ni Instagram T’es qui toi ?!
  2. Symfony Security Component - Guard symfony/security-guard
 ├── php >=5.5.9 ├──

    symfony/security-core ~2.8|~3.0
 └── symfony/security-http ~2.8|~3.0
  3. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur
  4. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur
  5. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur PasswordEncoder Vérification du mot de passe de l’utilisateur
  6. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur PasswordEncoder Vérification du mot de passe de l’utilisateur
  7. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur PasswordEncoder Vérification du mot de passe de l’utilisateur Authentifié !
  8. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur PasswordEncoder Vérification du mot de passe de l’utilisateur Authentifié !
  9. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur PasswordEncoder Vérification du mot de passe de l’utilisateur Authentifié ! 1 2 3 4
  10. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur PasswordEncoder Vérification du mot de passe de l’utilisateur Authentifié ! 1 2 3 4
  11. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur PasswordEncoder Vérification du mot de passe de l’utilisateur Authentifié ! 1 2 3 4
  12. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur PasswordEncoder Vérification du mot de passe de l’utilisateur Authentifié ! 1 2 3 4
  13. checkCredentials() bool UserInterface $user $credentials ➕ Concrètement… 
 ASTUCE Utiliser

    une BadCredentialsException
 et ne pas renvoyer false
 pour avoir plus d’info de debug. 3
  14. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur PasswordEncoder Vérification du mot de passe de l’utilisateur Authentifié ! 1 2 3 4
  15. createAuthenticatedToken() TokenInterface $authenticatedToken UserInterface $user Concrètement… 4 
 ASTUCE Il

    est possible d’étendre la classe AbstractGuardAuthenticator pour ne pas avoir implémenter
 cette méthode.
  16. SecurityEvents::INTERACTIVE_LOGIN Concrètement… 
 ASTUCE Déjà présent dans Symfony, on peut

    utiliser cet event pour : logger la date de connexion par exemple. 4
  17. Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials
 (username

    + password) User UserProvider Récupération de l’utilisateur PasswordEncoder Vérification du mot de passe de l’utilisateur Authentifié ! 1 2 3 4
  18. namespace Symfony\Component\Security\Guard; interface GuardAuthenticatorInterface extends AuthenticationEntryPointInterface { function getCredentials(); function

    getUser(, ); function checkCredentials(, ); function createAuthenticatedToken(, ); function onAuthenticationFailure(, ); function onAuthenticationSuccess(, , ); function supportsRememberMe(); } Concrètement…
  19. #app/config/security.yml security: firewalls: main: pattern: ^/ guard:
 authenticators: - app.authenticator.form

    - app.authenticator.sl_connect - app.authenticator.facebook Concrètement…
  20. #app/config/security.yml security: firewalls: main: pattern: ^/ guard:
 authenticators: - app.authenticator.form

    - app.authenticator.sl_connect - app.authenticator.facebook - app.authenticator.banana Concrètement…
  21. #app/config/security.yml security: firewalls: main: pattern: ^/ guard:
 authenticators: - app.authenticator.form

    - app.authenticator.sl_connect - app.authenticator.facebook - app.authenticator.banana entry_point: app.authenticator.form Concrètement…
  22. #app/config/security.yml security: firewalls: main: pattern: ^/ guard:
 authenticators: - app.authenticator.form

    - app.authenticator.sl_connect - app.authenticator.facebook - app.authenticator.banana entry_point: app.authenticator.form Concrètement…
  23. #app/config/security.yml security: firewalls: main: pattern: ^/ guard:
 authenticators: - app.authenticator.form

    - app.authenticator.sl_connect - app.authenticator.facebook - app.authenticator.banana entry_point: app.authenticator.form Concrètement… 
 AIDE Option entry_point permet de dire quel authenticator sera utilisé pour lancer la méthode start().
  24. public function start (Request $request, AuthenticationException $exception = null) {

    $url = $this->client->getAuthorizationUri( 'https://banana.com/connect/callback' ); return new RedirectResponse($url); } Exemples
  25. public function getCredentials(Request $request) { if ('/connect/callback' != $request->getPathInfo()) {

    return; } return $this->client->requestAccessToken( 'https://banana.com/connect/callback', $request->get('code') ); } Exemples
  26. Des trucs cools qu’on peut faire avec Guard 1 application,

    3 marques blanches: banane.com
 pomme.com
 ananas.com
  27. public function getCredentials(Request $request) { if ('banane.com' != $request->getHost()) {

    return; } return [ 'username' => $request->request->get('_username'), 'password' => $request->request->get('_password'), ]; } Des trucs cools qu’on peut faire avec Guard
  28. public function getCredentials(Request $request) { if ('pomme.com' != $request->getHost()) {

    return; } return [ 'phone' => $request->request->get('_phone'), 'password' => $request->request->get('_password'), ]; } Des trucs cools qu’on peut faire avec Guard
  29. public function getCredentials(Request $request) { if ('ananas.com' != $request->getHost()) {

    return; } return [ 'username' => $request->request->get('_username'), 'phone' => $request->request->get('_phone'), 'password' => $request->request->get('_password'), ]; } Des trucs cools qu’on peut faire avec Guard
  30. $client = static::createClient([], [ 'PHP_AUTH_USER' => 'username', 'PHP_AUTH_PW' => 'pa$$word',

    ]); # app/config/config_test.yml security: firewalls: your_firewall_name: http_basic: ~ Des trucs cools qu’on peut faire avec Guard Vous connaissez cette technique…
  31. $client = static::createClient([], [ 'PHP_AUTH_USER' => 'username', 'PHP_AUTH_PW' => 'pa$$word',

    ]); $client->request('/blog/mon-meilleur-article/edit'); $this->assertSame(200, $client->getResponse()->getStatusCode()); $client = static::createClient([], [ 'PHP_AUTH_USER' => 'username', 'PHP_AUTH_PW' => 'pa$$word', 'HTTP_X_AUTH_ID' => '2823a077-c587-4a43-b2d7-39b1238787bc', ]); $client->request('/blog/mon-meilleur-article/edit'); $this->assertSame(403, $client->getResponse()->getStatusCode()); Des trucs cools qu’on peut faire avec Guard
  32. $client = static::createClient([], [ 'PHP_AUTH_USER' => 'username', 'PHP_AUTH_PW' => 'pa$$word',

    ]); $client->request('/admin'); $this->assertSame(403, $client->getResponse()->getStatusCode()); $client = static::createClient([], [ 'PHP_AUTH_USER' => 'username', 'PHP_AUTH_PW' => 'pa$$word', 'HTTP_X_AUTH_ROLES' => 'ROLE_ADMIN-ROLE_USER', ]); $client->request('/admin'); $this->assertSame(200, $client->getResponse()->getStatusCode()); Des trucs cools qu’on peut faire avec Guard
  33. Des trucs cools qu’on peut faire avec Guard public function

    getCredentials(Request $request) { if (!$request->headers->has('PHP_AUTH_USER')) { return; } return [ 'username' => $request->headers->get('PHP_AUTH_USER'), 'password' => $request->headers->get('PHP_AUTH_PW'), 'id' => $request->headers->get('X_AUTH_ID'), 'roles' => explode( '-', $request->headers->get('X_AUTH_ROLES') ), ]; }
  34. Des trucs cools qu’on peut faire avec Guard public function

    getUser ($credentials, UserProviderInterface $userProvider) { return $userProvider->load($credentials); }
  35. Des trucs cools qu’on peut faire avec Guard # app/config/config_test.yml

    services: app.security.authenticator.test.http_header: class: Security\HttpHeaderTestGuardAuthenticator security: firewalls: your_firewall_name: guard: authenticators: - 'app.security.authenticator.test.http_header'