Альтернатива Sharepoint с помощью MODX Revolution

Всем привет.
Необходимо разработать альтернативу Sharepoint. Всё как обычно: есть несколько групп пользователей, они должны видеть только свои закачанные файлы, некоторые группы могут закачивать файлы, другие — нет.

Смысл — файлообмен после логина на сайт.

Вот думаю как это лучше сделать — через фронт и компонент Login или через бэкэнд, в админке (сделать источники файлов, позакрывать лишнее и т.д.)?

Хотелось бы на фронте.

Есть советы/идеи?

Спасибо.
Anton
07 июня 2021, 18:11
modx.pro
666
0

Комментарии: 20

Андрей Шевяков
07 июня 2021, 19:10
0
Для Авторизации/Регистрации — Office
Для Загрузки файлов — Uploadify
    Александр Мельник
    07 июня 2021, 21:02
    0
    Неплохо было бы расписать, что такое Sharepoint или это настолько популярная вещь, что не знать о ней стыдно?

    Расскажите как планируете делать показ и отдачу файлов пользователем? Мне кажется вы столкнетесь с той же проблемой, с которой вскоре столкнусь и я (правда не в рамках modx но все еще в рамках php)
    Поделитесь своими мыслями?
    Если файлы могут видеть и скачивать не все, то это означает что перед их отдачей нужно проверять наличие прав. А это значит что отдачу файла нельзя поручить просто вебсерверу, как обычную статику иначе при наличии прямой ссылки на файл кто угодно его скачает. А значит отдачу нужно производить уже через php, например читая file_get_contents() и отдавая file_put… Но я предвижу тут проблемы с файлами большого размера.
    Как планировали поступить вы?
      Сергей Шлоков
      08 июня 2021, 08:59
      +2
      Тыц. Тут тебе и права и скачивание больших файлов.
        Александр Мельник
        08 июня 2021, 09:20
        0
        Спасибо. Та примерно так я и планирую действовать, передавая заголовки ответа для скачивания и содержимое файла.
        Однако не могу сказать что я точно и доподлинно понимаю как работает встроенная функция readfile() в интерпретаторе php.
        Куда именно она читает, как работает с потоком, например видео.
        Что будет если 10 пользователей запросят на скачивание видео файл размером 12 гигабайт.
          Сергей Шлоков
          08 июня 2021, 09:29
          0
          Однако не могу сказать что я точно и доподлинно понимаю как работает встроенная функция readfile() в интерпретаторе php.
          Выкидывает данные сразу в выходной поток.

          Куда именно она читает, как работает с потоком, например видео.
          Думаю, как и с любыми другими типами файлов.

          Что будет если 10 пользователей запросят на скачивание видео файл размером 12 гигабайт.
          Наверно веб-сервер должен тебе ответить на этот вопрос )

          Можно попробовать вариант с переадресацией на статический файл — проверил права и редирект на файл. Тут надо смотреть, что оптимальнее.

          П.С. Да даже права проверять не нужно — проверяй их перед выводом списка файлов пользователю (лучше настоящие имена не выводить). А по клику переадресация на нормальный файл.
            Александр Мельник
            08 июня 2021, 09:42
            0
            Выкидывает данные сразу в выходной поток.
            раз сразу идет в stdout то как отдаются большие файлы? Он же должен делить их как то на порции?
            А по клику переадресация на нормальный файл.
            В таком случае один пользователь может передать другому ссылку и тот скачает файл без проблем.
              Сергей Шлоков
              08 июня 2021, 20:06
              0
              Из документации
              readfile() сама по себе не приводит к каким-либо проблемам с памятью, даже при отправке больших файлов. При возникновении ошибки превышения памяти убедитесь, что буферизация вывода отключена с помощью ob_get_level().
              Там же в комментациях как отдавать файл частями.

              Есть ещё такой вариант.
                Сергей Шлоков
                08 июня 2021, 20:18
                0
                  Александр Мельник
                  08 июня 2021, 20:59
                  0
                  Спасибо Сергей большое.
                  Я через поиск находил примерно эти же страницы, но просто работа над проектом еще не начата и я только вскользь ознакамливался с этой темой.
                  Набросал отдачу через file_put_content() и она работала хорошо, но я пробовал файлы около 100 мегабайт, а у меня предвидятся файлы с видеозаписями по 2-3 гигабайта, причем доступ к ним может быть сразу у сотни пользователей одновременно.
                  И иногда видеофайл нужно отдать на скачивание, а иногда его нужно запустить на воспроизведение в браузере и здесь я снова плаваю в теории, насколько я понимаю для воспроизведения в браузере как раз хорошо если буферизация включена.
                  В общем уже буду более детально вникать когда подпишем договор на эту работу.
                Александр Мельник
                10 июня 2021, 17:04
                0
                Да, документация по функции readfile() не обманула, оперативной памяти расходуется мало в момент отдачи файла, но… процессор сервера кладет в 100%.
                На сервере с такими характеристиками
                «Процессор1 x 2.8 ГГц
                Оперативная память 1 ГБ
                NVMe 10 ГБ»
                отдача даже одного файла приводит к полной загрузке процессора.
                  Anton
                  10 июня 2021, 17:39
                  0
                  В общем, реализовал так:
                  1. Создал группы ресурсов и пользователей.
                  2. Создал ресурсы, к которым открыл доступы нужным группам (ведь 1 пользователь может состоять в нескольких группах).
                  3. С помощью сниппета «FileDownload R» сделал вывод нужной директории с ftp.
                  4. С помощью .htaccess закрыл листинг этой директории.
                  5. Ну и стандартная логин-форма из сниппета «Login».

                  Теперь вопрос. Это безопасно?
                  Сергей Шлоков
                  10 июня 2021, 17:49
                  0
                  А если для сравнения отдать как статику? Мне кажется, для раздачи больших файлов сервер слабоват.
                    Александр Мельник
                    10 июня 2021, 18:21
                    0
                    Существенно ниже при отдаче как статики, около 15 процентов нагрузки на процессора от nginx процесса.
                    Конечно сервер самый простенький, но зато на нем более показательные получаются результаты. Раз одноядерный процессор может уйти в 100 процентов от отдачи одного файла, то значит нельзя рассчитывать только на вертикальное масштабирование сервера.
                    Даже если установить 16 ядер то 20 пользователей, которые примерно одновременно запросят на выдачу файл — уложат и 16 ядер легко.
                    Будем думать, к счастью время есть для поиска оптимального решения, возможно напишу линукс демон, который будет в фоновом режиме пережимать видео и с гигабайта останется 300 мегабайт.
                      Сергей Шлоков
                      10 июня 2021, 18:48
                      0
                      Ясно. Тогда я бы сделал так — для проверенных пользователей выводил бы список файлов. Кликнул «скачать» — идёт переадресация на страницу site.ru/download?file=filename. На ней проверяются права, счётчик и идёт переадресация на статический файл. Nginx нужно настроить на скачивание файлов вместо отдачи. Таким образом, PHP не используется.
                      Проверил у себя на Apache, работает.
                        Александр Мельник
                        10 июня 2021, 19:20
                        0
                        Разумная идея, спасибо.
                        Тут уже включаются нюансы проекта. Такой способ конечно хорош, но он не исключает того, что один пользователь получит законно ссылку на скачивание файла и передаст тому, кто такого права не имеет.
                        И тут уже будут юридические нюансы ответственности, если службой безопасности предприятия будет доказано, что файл был незаконно получен именно с сайта (то есть может быть скачан по прямой ссылке) то ответственность будет нести разработчик. Если же один человек скачал законно файл, а потом передал его по почте тому, кто доступа к файлу не имеет — будет отвечать сотрудник это сделавший.
                          Сергей Шлоков
                          10 июня 2021, 19:31
                          +1
                          А как можно увидеть прямую ссылку? Ты её формируешь на странице download. Пользователь её не видит. А когда файл отдаётся на скачивание, то ссылка тоже не светится.

                          Вот для примера файл лежит в modx.local/assets/files/.


                          Т.е. перед тем, как отдать файл, ты проверяешь права. Так что левый пользователь не сможет загрузить его.
                            Александр Мельник
                            10 июня 2021, 19:33
                            0
                            мне крыть нечем, это очень правильное замечание.
                            Сергей Шлоков
                            10 июня 2021, 19:50
                            +2
                            Вот простейший сниппет, который вызывается на странице 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 'Иди отседова.';
                            }
                            Скачивается только залогиненным пользователем. Гостю отворот-поворот.
        Роман
        08 июня 2021, 08:55
        0
        Интересная идея, делитесь опытом в реализации её.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          20