Objectifs de cette séance (1h) :
« session n. f. (télécommunications, informatique) : Période de temps continue qui s’écoule entre la connexion et la déconnexion à un réseau ou à un système, ou encore l’ouverture et la fermeture d’un logiciel d’application. »
Source : Grand dictionnaire terminologique - Office Québécois de la langue française
« In computer science and networking in particular, a session is a time-delimited two-way link, a practical (relatively high) layer in the TCP/IP protocol enabling interactive expression and information exchange between two or more communication devices or ends – be they computers, automated systems, or live active users (see login session). […] »
Source : https://en.wikipedia.org/wiki/Session_(computer_science)
À chaque requête :
Sans la session, continuité entre deux requêtes ?
utilise l’en-tête particulier « Set-Cookie
» (sur une ligne)
Set-Cookie: <nom>=<valeur>;expires=<Date>;domain=<NomDeDomaine>; path=<Path>
Exemple de réponse HTTP :
HTTP/1.1 200 OK Server: Netscape-Entreprise/2.01 Content-Type: text/html Content-Length: 100 Set-Cookie: clientID=6969;domain=unsite.com; path=/jeux <HTML>...
Par la suite, ce cookie sera renvoyé par le client au serveur, dans chaque requête ayant comme URL de début :
http://www.unsite.com/jeux/...
Objectifs de cette séance (1h) :
Autres aspects sécurité vus dans une séance ultérieure
Dans un monde ouvert (Internet, Web, standards)
Ce n’est pas parce que le code de l’application est caché sur le serveur que les méchants ne trouveront pas des failles !
#Fail
Objectifs de cette séance (1h) :
Inconvénient : pas de logout
Security
User
+ DoctrineCompletely Automated Public Turing test to tell Computers and Humans Apart
Vérifier qu’un humain est aux commandes
2FA (Two factor authentication)
Objectifs de cette séance (1h) :
Contrôle d’accès à base de rôles
Module « Firewall » de Symfony
Objectifs de cette séance (1h) :
User
du Modèle (et mapping Doctrine en base)User
symfony console make:user
namespace App\Entity;
use App\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
#[ORM\Entity(repositoryClass: UserRepository::class)]
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
// ...
#[ORM\Column(length: 180, unique: true)]
private ?string $email = null;
(appelée Member
dans le projet)
ROLE_SUPER_ADMIN
ROLE_ADMIN
ROLE_CLIENT
ROLE_USER
# security.yml role_hierarchy: ROLE_CLIENT: ROLE_USER ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN]
Contrôle l’accès aux URLs en fonction des rôles :
# app/config/security.yml
security:
# ...
firewalls:
# ...
default:
# ...
access_control:
# require ROLE_ADMIN for /admin*
- { path: ^/admin, roles: ROLE_ADMIN }
Contrôle d’accès sur les routes :
#[Route('/comment/{postId}/new', name: 'comment_new', methods: ['GET', 'POST'])]
#[IsGranted('IS_AUTHENTICATED_FULLY')]
function addComment(Post $post): Response {
//...
IS_AUTHENTICATED_FULLY
: un utilisateur qui vient vraiment de se reconnecter
Contrôle d’autorisation dans le code des méthodes :
public function adminDashboard(): Response {
$this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Access denied!');
« Entrée interdite, à moins que… »
Accès aux propriétés de l’utilisateur :
$this->getUser()
// ...
$email = $this->getUser()->getEmail();
$post->setAuthorEmail($email);
Gabarits Twig
{% if is_granted('ROLE_ADMIN') %}
<a href="...">Delete</a>
{% endif %}
Dans code d’une méthode de contrôleur :
$this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Access denied!');
équivalent à :
if (! $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
throw $this->createAccessDeniedException('Access denied!');
}
Déclenche une exception :
try {
// faire quelque chose qui appelle : throw
} catch (Exception $e) {
echo 'Exception reçue : ', $e->getMessage(), "\n";
}
Permet d’intercepter de façon standard les exceptions :
AccessDeniedException
(403)NotFoundHttpException
(404)[X]
HTTP (GET)[X]
PHP[X]
Doctrine[X]
Routeur Symfony[X]
HTML[X]
Twig[X]
CSS[X]
Formulaires[X]
Sessions[X]
Contrôle d’accèsTout ce qu’il faut pour un site mis en ligne