2016-12-22 10 views
0

Мне нужно создать проект, в котором пользователи будут входить в систему и загружать некоторые изображения и видео, и это должно быть так, что загруженные файлы должны быть видны только загрузчику или администратору сайта.Что является самым элегантным способом ограничить доступ пользователей к содержимому других пользователей?

I main Node.js, поэтому я попытался использовать экспресс-средние файлы, чтобы ограничить медиа-файлы пользователем, но мне стало известно, что это не лучший способ справиться с этим, так как выражение не подходит для рендеринга статический контент.

Вот несколько вариантов я могу думать после некоторых сеансов Google

  • Amazon S3 ведро, где каждый пользователь получает свои собственные папки/разрешения и файлы размером не в этом (но файлы действительно частный, когда у нас есть url)
  • Создайте временный URL-адрес файлов, используя предварительно подписанные URL-адреса из ведра S3 (файл будет открыт в течение 20 минут, я не хочу этого)
  • Ограничить доступ к Nginx (снова я не знать, может ли Nginx получить доступ к базе данных и подтвердить подлинность полученного запроса)
  • Использование GridFS с mongoDB? (я, вероятно, не буду использовать это, но хочу узнать, может ли это быть решением)

есть ли другой способ сделать это?

+0

Ваш контент не является статичным, если он зависит от того, кто вошел в систему. Самый простой способ - написать собственный код, который проверяет права, а затем загружает файл с диска. Нет ничего плохого в написании собственного кода загрузки файла в node.js или на любом другом языке.Вы должны беспокоиться о производительности ** только **, когда это становится проблемой. – freakish

ответ

1

Каждому пользователю присваивается уникальный идентификатор, где содержание (файлы & видео и т.д.) ссылается на часть этого ID таким образом, что клиенты получают доступ только к их содержимому ID

входе пользователя в систему nodejs пар, которые пользователь с их уникальный идентификатор, полученный из mongodb. Не нужно разгружать это для nginx. Где вы убираете контент, он не зависит от этой логики. Может быть локальной файловой системой, mongo, S3 и т. Д.

Избегайте ввода имени пользователя или идентификатора в любой URL, его избыточный сервер поддерживает эти знания внутри страны. Не нужно мутить URL. Например Amazon AWS имеет этот URL, когда я общаюсь с моим частным содержанием

https://console.aws.amazon.com/route53/home?#resource-record-sets:ZAHKXPA7IKZ8W

Смотреть это только показывает идентификатор контента, который является уникальным для ресурсов моего имени пользователя в. Цель состоит в том, чтобы свести к минимуму беспорядок в URL-адресе.

В качестве альтернативы, в мире совместного использования ресурсов, например, при мерцании, здесь указывается имя пользователя и ресурс. https://www.flickr.com/photos/okinawa-soba/31419099190/in/photostream/ В вашем случае, даже если кто-то забирает URL-адрес чужого содержимого, сервер должен отклонить его, поскольку он не уполномочен гадать с чужим содержанием

+0

, что тоже работает ... что, если URL-адрес выглядит как '/: username /: filename', и я настраиваю маршрут GET и добавляю промежуточное программное обеспечение, проверяющее сеанс, а также имя пользователя на маршруте (то же, что и сеанс). что должно работать нормально? –

1

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

Я не уверен, что это был бы самый эффективный способ.

Серьезно, однако, я бы предложил использовать промежуточное программное обеспечение express.static вместе с Passport или что-то реализовать аутентификацию и разрешения. Здесь вы не «визуализируете» какой-либо статический контент. Вы просто передаете файлы прямо с диска.

+0

может 'express.static' управлять загрузкой, даже если пользователи находятся в нескольких тысячах? (не одновременно tho) –

+0

@syedfaizan Я не понимаю, почему это не могло. См. [Этот ответ] (https://stackoverflow.com/questions/40788599/how-many-client-does-http-server-can-handle/40789071#40789071), где я провел несколько тестов с помощью 'http-server' и Я получил 10000 ** одновременных ** соединений без проблем. Я не думаю, что «express.static» здесь будет совсем другим. – rsp