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

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'