¿Cómo proteger la imagen de la vista pública en Laravel 5?

He instalado Laravel 5.0 y he hecho Autenticación. Todo está funcionando bien.

Mi sitio web solo está abierto para miembros autenticados. El contenido interno está protegido solo para miembros autenticados, pero las imágenes dentro del sitio no están protegidas para la vista pública.

Cualquiera escribe la URL de la imagen directamente puede ver la imagen, incluso si la persona no ha iniciado sesión en el sistema.

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

Mi pregunta: ¿ es posible proteger las imágenes (el ejemplo de URL anterior) de la vista pública, en otra palabra si una URL de la imagen se envía a cualquier persona, la persona debe ser miembro e iniciar sesión para poder ver la imagen.

¿Es eso posible y cómo?

    Es posible proteger las imágenes de la vista pública en la carpeta Laravel 5.x.

    • Crear carpeta de images carpeta de storage ( he elegido storage carpeta de storage porque ya tiene permiso de escritura que puedo usar cuando le cargue imágenes ) en Laravel como storage/app/images .

    • Mueva las imágenes que desea proteger de la carpeta pública a la nueva carpeta de images creada. También podría elegir otra ubicación para crear la carpeta de images pero no dentro de la carpeta pública, sino con la estructura de carpetas Laravel, pero sigue siendo un ejemplo de ubicación lógica que no está dentro de la carpeta del controlador. A continuación, debe crear una ruta y un controlador de imagen.

    Crear ruta

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

    La ruta reenviará todos los accesos de solicitud de imágenes a la página Autenticación si la persona no ha iniciado sesión.

    Crear imágenesController

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

    Puede modificar la ruta de almacenamiento y la estructura de archivos / carpetas que desee para cumplir con sus requisitos, esto es solo para demostrar cómo lo hice y cómo funciona.

    También puede agregar condición para mostrar las imágenes solo para miembros específicos en el controlador.

    También es posible agregar el nombre del archivo con el nombre del archivo, la marca de tiempo y otras variables además.


    Además: algunos preguntaron si este método se puede utilizar como alternativa a la carga de carpetas públicas, SÍ es posible, pero no se recomienda la práctica tal como se explica en esta respuesta . Entonces, el mismo método también se puede usar para cargar imágenes en la ruta de almacenamiento, incluso si no tiene la intención de protegerlas, simplemente siga el mismo proceso pero elimine 'middleware' => 'auth', De esta forma, no otorgará el permiso 777 en su carpeta pública y aún tendrá un entorno de carga segura. La misma respuesta mencionada también explica cómo usar este método sin autenticación en caso de que alguien lo use o brinde una solución alternativa también.

    En realidad, no lo he intentado pero encontré el módulo auth_request Nginx que te permite verificar la autenticación desde Laravel, pero aún enviar el archivo usando Nginx.

    Envía una solicitud interna a una url determinada y verifica si el código http es correcto (2xx) o falla (4xx) y, si tiene éxito, permite al usuario descargar el archivo.

    Editar: Otra opción es algo que he intentado y parecía funcionar bien. Puede usar X-Accel-Redirect -header para servir el archivo desde Nginx. La solicitud pasa por PHP, pero en lugar de enviar todo el archivo, simplemente envía la ubicación del archivo a Nginx, que luego lo envía al cliente.