web-dev-qa-db-fra.com

Comment protéger l’image de la vue publique dans Laravel 5?

J'ai installé Laravel 5.0 et j'ai effectué l'authentification. Tout fonctionne très bien.

Mon site Web est ouvert uniquement aux membres authentifiés. Le contenu à l'intérieur est protégé uniquement par les membres authentifiés, mais les images à l'intérieur du site ne sont pas protégées pour l'affichage public.

Toute personne qui écrit directement l'URL de l'image peut voir l'image, même si la personne n'est pas connectée au système.

http://www.somedomainname.net/images/users/userImage.jpg

Ma question: est-il possible de protéger les images (exemple de l'URL ci-dessus) de la vue publique, autrement dit dans Word si une URL de l'image est envoyée à une personne, cette personne doit être membre et s'identifier pour pouvoir voir le fichier image.

Est-ce possible et comment?

17
user4980957

Il est possible de protéger les images de la vue public view dans le dossier Laravel 5.x.

  • Créez un dossier images sous le dossier storage (J'ai choisi le dossier storage car il dispose déjà de l'autorisation d'écriture que je peux utiliser lorsque je lui télécharge des images) dans Laravel comme storage/app/images

  • Déplacez les images que vous souhaitez protéger du dossier public vers le nouveau dossier images créé. Vous pouvez également choisir un autre emplacement pour créer le dossier images, mais pas à l'intérieur du dossier public, mais avec une structure de dossiers dans Laravel, mais un exemple d'emplacement logique ne se trouvant pas à l'intérieur du dossier du contrôleur. Ensuite, vous devez créer une route et un contrôleur d’image.

Créer un itinéraire

Route::get('images/users/{user_id}/{slug}', [
     'as'         => 'images.show',
     'uses'       => 'ImagesController@show',
     'middleware' => 'auth',
]);

La route transmettra tous les accès aux requêtes d’images sur la page d’authentification si la personne n’est pas connectée.

Create ImagesController

class ImagesController extends Controller {

    public function show($user_id, $slug)
    {
        $storagePath = storage_path('app/images/users/' . $user_id . '/' . $slug);
        return Image::make($storagePath)->response();
    }
}

Vous pouvez modifier le chemin de stockage et la structure de fichier/dossier selon vos besoins. Il vous suffit de montrer comment je l'ai fait et comment cela fonctionne.

Vous pouvez également ajouter une condition pour afficher les images uniquement pour des membres spécifiques du contrôleur.

Il est également possible de hacher le nom du fichier avec nom de fichier, horodatage et autres variables en plus.


Ajout: certains ont demandé si cette méthode pouvait être utilisée comme alternative au téléchargement de dossiers publics. OUI c'est possible, mais ce n'est pas une pratique recommandée, comme expliqué dans ce réponse . Ainsi, la même méthode peut également être utilisée pour télécharger des images dans le chemin de stockage, même si vous ne souhaitez pas les protéger. Suivez simplement le même processus, mais supprimez 'middleware' => 'auth',. De cette manière, vous n'accorderez pas l'autorisation 777 dans votre dossier public et vous disposerez toujours d'un environnement de téléchargement sécurisé. La même chose mentionnée réponse explique également comment utiliser cette méthode avec authentification immédiate au cas où quelqu'un l'utiliserait ou offrant une solution alternative.

26

Je n’ai pas réellement essayé cela, mais j’ai trouvé Nginx auth_request module qui vous permet de vérifier l’authentification de Laravel, mais continue d’envoyer le fichier à l’aide de Nginx.

Il envoie une requête interne à l'URL donnée et vérifie si le code http a réussi (2xx) ou échec (4xx). En cas de succès, l'utilisateur peut télécharger le fichier.

Edit: Une autre option est quelque chose que j'ai essayé et cela semblait bien fonctionner. Vous pouvez utiliser X-Accel-Redirect -header pour servir le fichier à partir de Nginx. La requête passe par PHP, mais au lieu d’envoyer le fichier entier, elle envoie simplement l’emplacement du fichier à Nginx qui le transmet ensuite au client.

0
Dilaz