Créer simplement un accès sécurisé à des fichiers avec Symfony
Prérequis
Pour bien suivre ce tutoriel, vous devez être à l’aise avec Symfony.
Comment fonctionne l’accès au fichier sur un serveur web ?
De manière générale, un projet web comporte plusieurs dossiers qui correspondent aux différents types de fichier dont a besoin le site internet pour fonctionner. Parmi ces dossiers, l’un d’entre eux est exposé publiquement, dans le cas de Symfony, il s’agit du dossier public.
Dans ce dossier, on retrouvera tous les fichiers accessibles depuis l’extérieur. Parmi ceux-ci, se trouve le fichier index.php qui reçoit les requêtes de l’extérieur et les traites à l’aide du reste du code PHP de l’application. On y trouvera également les fichiers statiques qui y sont accessibles via leurs URL, il sera également possible d’accéder à des dossiers et à la liste des fichiers qu’ils contiennent selon la configuration du serveur même si généralement, on considérera que ce n’est pas souhaitable.
Pourquoi vouloir créer un accès sécurisé à des fichiers ?
Il peut être pertinent de créer un accès sécurisé à des fichiers dans de nombreux cas. Vous pourriez par exemple vouloir restreindre l’accès d’un fichier aux personnes ayant un compte sur le site, aux personnes ayant préalablement payé pour accéder à ce fichier ou à la personne ayant ajouté ce fichier sur votre plateforme.
Dans l’ensemble de ces cas de figure, exposé ces fichiers dans le dossier public n’est pas envisageable, car il serait alors accessible toute personne possédant l’URL du fichier, ce qui ne serait pas vraiment sécurisé.
Comment créer un accès sécurisé à des fichiers statiques ?
Heureusement, avec Symfony, créer un accès sécurisé est très simple.
Tout d’abord, il faudra créer un dossier dans le projet qui ne soit pas dans le dossier public. Dans notre exemple, nous créerons le dossier secure_image à la racine d’un projet Symfony classique où nous placerons un fichier cat.png.
Ensuite, vous devrez créer un controller dans lequel vous ajouterez une action qui renverra le fichier sécurisé. Dans notre exemple, nous créerons le controller PublicController qui se trouvera dans le dossier src/Controller.
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class PublicController extends AbstractController
{
//..
}
Dans notre nouveau controller, on ajoutera l’action suivante :
<?php
#[Route('/', name: 'app_public')]
public function index(): Response
{
$isAllowed = /* Condition pour accéder au fichier */;
if ($isAllowed) {
return new BinaryFileResponse(__DIR__ . '/../../secure_image/cat.png');
}
// Renvoi une réponse avec un code 403
return new Response(status: Response::HTTP_FORBIDDEN);
}
Dans cette action après avoir contrôlé, si l’utilisateur a le droit d’accéder au fichier, vous pouvez utiliser la classe BinaryFileResponse pour retourner le fichier, cette dernière aura besoin que vous lui passiez le chemin du fichier en paramètre. Si l’utilisateur n’a pas le droit d’accéder au fichier, vous pourrez renvoyer une erreur avec le code 403.
Voilà, vous savez maintenant comment créer un accès sécurisé à des fichiers simplement avec Symfony