Альтернатива Sharepoint с помощью MODX Revolution
Всем привет.
Необходимо разработать альтернативу Sharepoint. Всё как обычно: есть несколько групп пользователей, они должны видеть только свои закачанные файлы, некоторые группы могут закачивать файлы, другие — нет.
Смысл — файлообмен после логина на сайт.
Вот думаю как это лучше сделать — через фронт и компонент Login или через бэкэнд, в админке (сделать источники файлов, позакрывать лишнее и т.д.)?
Хотелось бы на фронте.
Есть советы/идеи?
Спасибо.
Необходимо разработать альтернативу Sharepoint. Всё как обычно: есть несколько групп пользователей, они должны видеть только свои закачанные файлы, некоторые группы могут закачивать файлы, другие — нет.
Смысл — файлообмен после логина на сайт.
Вот думаю как это лучше сделать — через фронт и компонент Login или через бэкэнд, в админке (сделать источники файлов, позакрывать лишнее и т.д.)?
Хотелось бы на фронте.
Есть советы/идеи?
Спасибо.
Комментарии: 20
Неплохо было бы расписать, что такое Sharepoint или это настолько популярная вещь, что не знать о ней стыдно?
Расскажите как планируете делать показ и отдачу файлов пользователем? Мне кажется вы столкнетесь с той же проблемой, с которой вскоре столкнусь и я (правда не в рамках modx но все еще в рамках php)
Поделитесь своими мыслями?
Если файлы могут видеть и скачивать не все, то это означает что перед их отдачей нужно проверять наличие прав. А это значит что отдачу файла нельзя поручить просто вебсерверу, как обычную статику иначе при наличии прямой ссылки на файл кто угодно его скачает. А значит отдачу нужно производить уже через php, например читая file_get_contents() и отдавая file_put… Но я предвижу тут проблемы с файлами большого размера.
Как планировали поступить вы?
Расскажите как планируете делать показ и отдачу файлов пользователем? Мне кажется вы столкнетесь с той же проблемой, с которой вскоре столкнусь и я (правда не в рамках modx но все еще в рамках php)
Поделитесь своими мыслями?
Если файлы могут видеть и скачивать не все, то это означает что перед их отдачей нужно проверять наличие прав. А это значит что отдачу файла нельзя поручить просто вебсерверу, как обычную статику иначе при наличии прямой ссылки на файл кто угодно его скачает. А значит отдачу нужно производить уже через php, например читая file_get_contents() и отдавая file_put… Но я предвижу тут проблемы с файлами большого размера.
Как планировали поступить вы?
Тыц. Тут тебе и права и скачивание больших файлов.
Спасибо. Та примерно так я и планирую действовать, передавая заголовки ответа для скачивания и содержимое файла.
Однако не могу сказать что я точно и доподлинно понимаю как работает встроенная функция readfile() в интерпретаторе php.
Куда именно она читает, как работает с потоком, например видео.
Что будет если 10 пользователей запросят на скачивание видео файл размером 12 гигабайт.
Однако не могу сказать что я точно и доподлинно понимаю как работает встроенная функция readfile() в интерпретаторе php.
Куда именно она читает, как работает с потоком, например видео.
Что будет если 10 пользователей запросят на скачивание видео файл размером 12 гигабайт.
Однако не могу сказать что я точно и доподлинно понимаю как работает встроенная функция readfile() в интерпретаторе php.Выкидывает данные сразу в выходной поток.
Куда именно она читает, как работает с потоком, например видео.Думаю, как и с любыми другими типами файлов.
Что будет если 10 пользователей запросят на скачивание видео файл размером 12 гигабайт.Наверно веб-сервер должен тебе ответить на этот вопрос )
Можно попробовать вариант с переадресацией на статический файл — проверил права и редирект на файл. Тут надо смотреть, что оптимальнее.
П.С. Да даже права проверять не нужно — проверяй их перед выводом списка файлов пользователю (лучше настоящие имена не выводить). А по клику переадресация на нормальный файл.
Выкидывает данные сразу в выходной поток.раз сразу идет в stdout то как отдаются большие файлы? Он же должен делить их как то на порции?
А по клику переадресация на нормальный файл.В таком случае один пользователь может передать другому ссылку и тот скачает файл без проблем.
Из документации
Есть ещё такой вариант.
readfile() сама по себе не приводит к каким-либо проблемам с памятью, даже при отправке больших файлов. При возникновении ошибки превышения памяти убедитесь, что буферизация вывода отключена с помощью ob_get_level().Там же в комментациях как отдавать файл частями.
Есть ещё такой вариант.
Вот более подробные примеры.
Спасибо Сергей большое.
Я через поиск находил примерно эти же страницы, но просто работа над проектом еще не начата и я только вскользь ознакамливался с этой темой.
Набросал отдачу через file_put_content() и она работала хорошо, но я пробовал файлы около 100 мегабайт, а у меня предвидятся файлы с видеозаписями по 2-3 гигабайта, причем доступ к ним может быть сразу у сотни пользователей одновременно.
И иногда видеофайл нужно отдать на скачивание, а иногда его нужно запустить на воспроизведение в браузере и здесь я снова плаваю в теории, насколько я понимаю для воспроизведения в браузере как раз хорошо если буферизация включена.
В общем уже буду более детально вникать когда подпишем договор на эту работу.
Я через поиск находил примерно эти же страницы, но просто работа над проектом еще не начата и я только вскользь ознакамливался с этой темой.
Набросал отдачу через file_put_content() и она работала хорошо, но я пробовал файлы около 100 мегабайт, а у меня предвидятся файлы с видеозаписями по 2-3 гигабайта, причем доступ к ним может быть сразу у сотни пользователей одновременно.
И иногда видеофайл нужно отдать на скачивание, а иногда его нужно запустить на воспроизведение в браузере и здесь я снова плаваю в теории, насколько я понимаю для воспроизведения в браузере как раз хорошо если буферизация включена.
В общем уже буду более детально вникать когда подпишем договор на эту работу.
Да, документация по функции readfile() не обманула, оперативной памяти расходуется мало в момент отдачи файла, но… процессор сервера кладет в 100%.
На сервере с такими характеристиками
«Процессор1 x 2.8 ГГц
Оперативная память 1 ГБ
NVMe 10 ГБ»
отдача даже одного файла приводит к полной загрузке процессора.
На сервере с такими характеристиками
«Процессор1 x 2.8 ГГц
Оперативная память 1 ГБ
NVMe 10 ГБ»
отдача даже одного файла приводит к полной загрузке процессора.
В общем, реализовал так:
1. Создал группы ресурсов и пользователей.
2. Создал ресурсы, к которым открыл доступы нужным группам (ведь 1 пользователь может состоять в нескольких группах).
3. С помощью сниппета «FileDownload R» сделал вывод нужной директории с ftp.
4. С помощью .htaccess закрыл листинг этой директории.
5. Ну и стандартная логин-форма из сниппета «Login».
Теперь вопрос. Это безопасно?
1. Создал группы ресурсов и пользователей.
2. Создал ресурсы, к которым открыл доступы нужным группам (ведь 1 пользователь может состоять в нескольких группах).
3. С помощью сниппета «FileDownload R» сделал вывод нужной директории с ftp.
4. С помощью .htaccess закрыл листинг этой директории.
5. Ну и стандартная логин-форма из сниппета «Login».
Теперь вопрос. Это безопасно?
Вроде норм. Подсмотреть логику скачиваний можно в FileAttach.
А если для сравнения отдать как статику? Мне кажется, для раздачи больших файлов сервер слабоват.
Существенно ниже при отдаче как статики, около 15 процентов нагрузки на процессора от nginx процесса.
Конечно сервер самый простенький, но зато на нем более показательные получаются результаты. Раз одноядерный процессор может уйти в 100 процентов от отдачи одного файла, то значит нельзя рассчитывать только на вертикальное масштабирование сервера.
Даже если установить 16 ядер то 20 пользователей, которые примерно одновременно запросят на выдачу файл — уложат и 16 ядер легко.
Будем думать, к счастью время есть для поиска оптимального решения, возможно напишу линукс демон, который будет в фоновом режиме пережимать видео и с гигабайта останется 300 мегабайт.
Конечно сервер самый простенький, но зато на нем более показательные получаются результаты. Раз одноядерный процессор может уйти в 100 процентов от отдачи одного файла, то значит нельзя рассчитывать только на вертикальное масштабирование сервера.
Даже если установить 16 ядер то 20 пользователей, которые примерно одновременно запросят на выдачу файл — уложат и 16 ядер легко.
Будем думать, к счастью время есть для поиска оптимального решения, возможно напишу линукс демон, который будет в фоновом режиме пережимать видео и с гигабайта останется 300 мегабайт.
Ясно. Тогда я бы сделал так — для проверенных пользователей выводил бы список файлов. Кликнул «скачать» — идёт переадресация на страницу site.ru/download?file=filename. На ней проверяются права, счётчик и идёт переадресация на статический файл. Nginx нужно настроить на скачивание файлов вместо отдачи. Таким образом, PHP не используется.
Проверил у себя на Apache, работает.
Проверил у себя на Apache, работает.
Разумная идея, спасибо.
Тут уже включаются нюансы проекта. Такой способ конечно хорош, но он не исключает того, что один пользователь получит законно ссылку на скачивание файла и передаст тому, кто такого права не имеет.
И тут уже будут юридические нюансы ответственности, если службой безопасности предприятия будет доказано, что файл был незаконно получен именно с сайта (то есть может быть скачан по прямой ссылке) то ответственность будет нести разработчик. Если же один человек скачал законно файл, а потом передал его по почте тому, кто доступа к файлу не имеет — будет отвечать сотрудник это сделавший.
Тут уже включаются нюансы проекта. Такой способ конечно хорош, но он не исключает того, что один пользователь получит законно ссылку на скачивание файла и передаст тому, кто такого права не имеет.
И тут уже будут юридические нюансы ответственности, если службой безопасности предприятия будет доказано, что файл был незаконно получен именно с сайта (то есть может быть скачан по прямой ссылке) то ответственность будет нести разработчик. Если же один человек скачал законно файл, а потом передал его по почте тому, кто доступа к файлу не имеет — будет отвечать сотрудник это сделавший.
А как можно увидеть прямую ссылку? Ты её формируешь на странице download. Пользователь её не видит. А когда файл отдаётся на скачивание, то ссылка тоже не светится.
Вот для примера файл лежит в modx.local/assets/files/.
Т.е. перед тем, как отдать файл, ты проверяешь права. Так что левый пользователь не сможет загрузить его.
Вот для примера файл лежит в modx.local/assets/files/.
Т.е. перед тем, как отдать файл, ты проверяешь права. Так что левый пользователь не сможет загрузить его.
мне крыть нечем, это очень правильное замечание.
Вот простейший сниппет, который вызывается на странице modx.local/download?file=dl.txt
if ($modx->user->isAuthenticated('web')) {
$file = basename($_GET['file']);
if (!empty($file) && file_exists(MODX_BASE_PATH . "assets/files/{$file}")) {
header("Location: http://modx.local/assets/files/{$file}");
exit();
} else {
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
}
} else {
return 'Иди отседова.';
}
Скачивается только залогиненным пользователем. Гостю отворот-поворот.
Интересная идея, делитесь опытом в реализации её.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.