2015-06-06 3 views
13

Я установил Laravel 5.0 и сделал аутентификацию. Все работает отлично.Как защитить изображение от общественного мнения в Laravel 5?

Мой веб-сайт открыт только для пользователей, прошедших проверку подлинности. Содержимое внутри защищено только для пользователей, прошедших проверку подлинности, но изображения внутри сайта не защищены для общего доступа.

Любой, кто пишет URL-адрес изображения, может видеть изображение, даже если человек не вошел в систему.

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

Мой вопрос: можно ли защитить изображения (в приведенном выше примере URL) из поля зрения общественности, другими словами, если URL изображения отправить любому лицу, человек должен быть членом и войти в уметь видеть изображение.

Это возможно и как?

+0

Вы пробовали настроить маршрут для защиты пути изображения? – haakym

+0

нет, но я попробую следующий ответ и дам вам знать –

+0

@haakym, это пример ниже работал для меня. Вы правы, это в пути. –

ответ

23

Можно защитить изображения от общественное мнение в папке Laravel 5.x.

  • Создать images папку в папке storage (я выбрал storage папку, потому что он имеет право на запись уже, что я могу использовать, когда я загружать изображения на нем) в Laravel как storage/app/images.

  • Переместить изображения, которые вы хотите защитить из общей папки, в новую созданную папку images. Вы также можете выбрать другое место для создания папки images, но не внутри общей папки, но в структуре папок Laravel, но все же логический пример местоположения, а не внутри папки контроллера. Затем вам нужно создать маршрут и контроллер изображения.

Создать маршрут

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

Маршрут будет пересылать все доступы запрос изображения на странице аутентификации, если человек не вошел в систему.

Создать 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(); 
    } 
} 

Вы можете изменить путь к хранилищу и структуру файлов/папок по своему усмотрению, это просто показать, как я это сделал и как это работает.

Вы также можете добавить условия, чтобы показывать изображения только для определенных членов в контроллере.

Также возможно хэш-файл с именем файла, меткой времени и другими переменными.


Дополнение некоторые спросили, если этот метод может быть использован в качестве альтернативы загрузки общих папок, YES это возможно, но не рекомендуется практика, как описано в этом answer. Таким образом, один и тот же метод можно также использовать для загрузки изображений в путь хранения, даже если вы не собираетесь их защищать, просто следуйте одному и тому же процессу, но удалите 'middleware' => 'auth',.Таким образом, вы не дадите разрешение 777 в своей общей папке и все еще имеете безопасную среду для загрузки. В том же упоминании answer также объясняется, как использовать этот метод без аутентификации в случае, если кто-то его использовал или предоставил альтернативное решение.

+0

не рекомендуется для обычной загрузки изображений без защиты, так как производительность будет намного хуже, чем позволить обработке apache \ nginx, обслуживающей изображения –

+0

@ AmirBar, каково ваше альтернативное решение? –

+0

для обычной загрузки изображения, которая не требуется защищать, а затем загружать в общую папку и разрешать nginx обрабатывать ее –

0

Я на самом деле не пробовал это, но нашел модуль Nginx auth_request, который позволяет проверить подлинность с Laravel, но все же отправить файл с помощью Nginx.

Он отправляет внутренний запрос на указанный URL-адрес и проверяет успешный код http (xxx) или сбой (4xx) и на успех, позволяет пользователю загрузить файл.

Редактировать: Еще один вариант - это то, что я пробовал, и, похоже, он работает нормально. Вы можете использовать X-Accel-Redirect -header для обслуживания файла от Nginx. Запрос проходит через PHP, но вместо отправки всего файла он просто отправляет местоположение файла в Nginx, который затем отправляет его клиенту.

Смежные вопросы