Share
Embed
Transcript
109 slides
-
@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 ?! -
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 -
Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials (username
+ password) UserProvider Récupération de l’utilisateur -
Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials (username
+ password) UserProvider Récupération de l’utilisateur -
Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials (username
+ password) User UserProvider Récupération de l’utilisateur -
Pourtant l’authentification c’est simple : Compliqué… (un peu) Credentials (username
+ password) User UserProvider Récupération de l’utilisateur -
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 -
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 -
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é ! -
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é ! -
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 -
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 -
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 -
getUser() UserInterface $user $credentials Concrètement… ASTUCE Utiliser une UsernameNotFoundException
et ne pas renvoyer null pour avoir plus d’info de debug. 2 -
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 -
checkCredentials() bool UserInterface $user $credentials ➕ Concrètement… ASTUCE Utiliser
une BadCredentialsException et ne pas renvoyer false pour avoir plus d’info de debug. 3 -
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 -
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. -
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 -
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 -
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… -
#app/config/security.yml security: firewalls: main: pattern: ^/ guard: authenticators: - app.authenticator.form
- app.authenticator.sl_connect Concrètement… -
#app/config/security.yml security: firewalls: main: pattern: ^/ guard: authenticators: - app.authenticator.form
- app.authenticator.sl_connect - app.authenticator.facebook Concrètement… -
#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… -
#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… -
#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… -
#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(). -
public function start (Request $request, AuthenticationException $exception = null) {
$url = $this->client->getAuthorizationUri( 'https://banana.com/connect/callback' ); return new RedirectResponse($url); } Exemples -
public function getCredentials(Request $request) { if ('/connect/callback' != $request->getPathInfo()) {
return; } return $this->client->requestAccessToken( 'https://banana.com/connect/callback', $request->get('code') ); } Exemples -
Systèmes d’authentification différents par marque blanche Des trucs cools qu’on
peut faire avec Guard -
Des trucs cools qu’on peut faire avec Guard 1 application,
3 marques blanches: banane.com pomme.com ananas.com -
banane.com Des trucs cools qu’on peut faire avec Guard Username:
Password: LO G I N -
pomme.com Des trucs cools qu’on peut faire avec Guard Phone:
Password: LO G I N -
ananas.com Des trucs cools qu’on peut faire avec Guard Username:
Password: LO G I N Phone: -
Des trucs cools qu’on peut faire avec Guard banane.com Username:
Password: LO G I N -
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 -
pomme.com Des trucs cools qu’on peut faire avec Guard Phone:
Password: LO G I N -
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 -
ananas.com Des trucs cools qu’on peut faire avec Guard Username:
Password: LO G I N Phone: -
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 -
Modifier un utilisateur lors de tests fonctionnels Des trucs cools
qu’on peut faire avec Guard -
$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… -
$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 -
$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 -
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') ), ]; } -
Des trucs cools qu’on peut faire avec Guard public function
getUser ($credentials, UserProviderInterface $userProvider) { return $userProvider->load($credentials); } -
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'