Хочу предложить небольшой конкурс, идея возникла после прочтения одного задания на флиланс-бирже. (Работа оценивалась в $50) Думаю, сама задача довольна типичная для мелких самодельных сайтов. Имеется сайт из нескольких страниц. Владелец делал некоторую автоматизацию, но только сейчас ему понадобилось управлять доступом. Мы ничего не знаем о структуре и задачах сайта. Знаем только, что страницы на PHP и точек входа много, не только index.php. Каждая страница — отдельный файл. Надо сделать простую авторизацию чтобы владелец мог настраивать какой пользователь какие страница может открыть. htacces+htpasswd не вариант, надо использовать PHP, решение должно быть портируемым. Остальное на усмотрение разработчика, НО надо сделать максимально компактно и максимально просто. Требования к установке должны быть скромными. Видимо на файлах, видимо без админки, только за счет редактирования конфигурации, но опять на ваше усмотрение. Владелец имеет полный доступ к файлам, если ему объяснить что надо менять, он сумеет. Лучшее решение — компактное, гибкое и понятное не слишком продвинутому вебмастеру. Победитель зарабатывает риспект и уважуху, все читатели получают несколько полезных рецептов.
denis01, это должно быть компактно и просто. Фреймворки не умеют так. Но ты можешь попытаться что-то извлечь
т.е. юзеры уже както авторизуются на сайте? юзеров можно пересчитать по пальцам? страниц тоже мало? нужно просто определять кого куда пускать? тогда хватит чегото такого: AUTH.PHP Код (PHP): session_start(); // CONFIG: Устанавливаем пути до файлов и каталогов $rules = [ // Формат: относительный урл => Список логинов (через пробел) '/*' => 'user1 user2' // все страницы и подкаталоги, от корня ,'/test.php' => 'runcore user2' // отдельный файл ,'/kcaptcha/util/*'=> 'runcore' // каталог и все подкаталоги ]; // Получаем Логин пользователя $_SESSION['username'] = 'runcore'; // todo: Временная заглушка, тут получаем логин юзера! $username = isset($_SESSION['username']) ? trim($_SESSION['username']) : null; // ПРОВЕРКА ДОСТУПА /////////////////////////////////////// $path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ); $allow = false; foreach($rules as $url=>$users) { // ищем до Первого совпадения $isValidPath = isset($rules[$path]); // File if ( !$isValidPath && strpos($url,'/*')!==false ) { // Dir $url = str_replace('/*','',$url); if ( empty($url) || strpos($path,$url)!==false ) { // Root || Inside Dir $isValidPath = true; } } if ($isValidPath && in_array($username, explode(' ',$users)) ) { $allow = true; break; } }//foreach // Запрещено ВСЁ что неразрешено! if (!$allow || empty($username) || empty($rules) ) exit('Access denied'); unset($rules,$path,$username, $allow,$isValidPath); и ВЕЗДЕ, во ВСЕ точки входа, вначале вставляем вызов этого скриптика Код (PHP): <?php include('./auth.php'); либо прописать в auto_prepend_file p.s. ну если юзеров и страниц много, то решение конечно нужно делать другое. выносить настройки в файлы или в БД, и т.д.
Дело в том, что по стоимости разработки прикрутить ACL от знакомого фремворка много дешевле, чем что-то на коленке брать или, упаси боже, брать решения с php.ru
инклудить из стандартного путя инклуда, и если не авторизован или неправильно авторизован, то вылетать из пхп вообше. Итого надо добавить в каждый файл одну строку. А насколько я помню, в пхп есть возможность прикрутить некий стандартный скрипт который будет запускаться всегда (auto_prepend_file), и вообще не придётся ничего трогать в "сайте".
runcore, очень хорошо. только авторизовать придется тебе. Mikslr, ты включаешь в "боже упаси с php.ru" и свои собственные советы? насчет знакомого фреймворка я бы согласился. только надо чтобы решение было понятно не себе любимомому, а клиенту. значит не годится. igordata, хорошая мысль.
Жаль соревновательности не получилось. runcore в целом обозначил простую и годную схему, респект ему и уважуха! Я склепаю нечто подобное, но вынесу зависимости: правила и метод авторизации, куда-нибудь наружу. Результат опубликую.
да, жаль. народ отвыкает думать сам, привыкли что все уже сделано дядей, даже для элементарных задач привлекают огромные фреймворки. в любом случае, продолжай подобные конкурсы. может растормашим народ. p.s. я тут, на досуге, начал личный эксперимент. just for fun. Идея такая. попробовать реализовать микро-фреймворк, соответствующий идеологии UNIX WAY. т.е. Набор узкоспециализированных классов, реализующих четкий функционал, независимых, но легко работающих вместе. каждый из них(аналогия unix way): - Класс делают что-то одно и делают это хорошо. - Классы, которые работают(могут) вместе (но не внутри друг друга, связность минимальна либо отсутсвует). - Классы, имеющие некие универсальные интерфейсы конфигурации, окружения, обмена данными и т.д. Например: Валидатор, Кешер, Конструктор форм, Шаблонизатор, ACL... и т.д. внутри сайта, они будут работать как единая команда, "понимая друг друга с полуслова". Но если нужен какойто отдельный Класс-функционал, то легко берем и юзаем тоже, зависимости минимальны или отсутсвуют, а конфигурация и интерфейс обмена данными простые и единые везде.
Я уже ковыряю свой "минимально достаточный фреймворк": https://github.com/scrap-bin/unicycle/tree/master/src/R2 Непростой вопрос на каком уровне достаточности можно остановиться )))
ага) попробуй выдрать из него чтото. ну например нужен нам валидатор для форм, он мощный конечно, но: - сам валидатор это более 50 файлов на все случаи жизни (EmailAdress.php, Ip.php ...) - зависимость от Zend/Stdlib - это еще 30 файлов - сами классы по работе с Формами тоже под 50шт - + зависимости от Zend\InputFilter, Zend/Stdlib, Zend\ServiceManager .... дальше просто лень искать зависимости)) Добавлено спустя 4 минуты 42 секунды: поковыряюсь на досуге.
Применительно к этой теме, на моём "фреймворке" можно написать в конфиге Код (Text): access_control: - { path: ^/admin/, role: [ROLE_ADMIN, ROLE_MOD] } - { path: ^/user/profile/, role: [ROLE_USER] } - { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY } и без доп. проверок в контроллерах адреса будут защищены. Но чтобы это заработало надо - парсер YAML - модель "Пользователь" - какой-нибудь модуль аутентификации - наконец метод WebApplication::checkAccess() который сделает Код (PHP): array_intersect($userRoles, $requiredRoles) в общем, в конфиге оно выглядит лаконично, а в реализации не очень.
полностью от этого не уйти. можно лишь попытаться уменьшить список зависимостей. но минимум останется некая системная библиотечка, с самыми базовыми функциями. а вообще логично. Любая задача разбивается на мелкие подзадачи, решением которых занимаются отдельные готовые микро-инструменты. погоня за излишней универсальностью инструментов неизбежно приведет к увеличению зависимостей между классами и распуханием фреймворка. каждый для себя ищет золотую середину. при достижении которой можно остановится.
Че-то мне подсказывает что некоторые так называемые фреймворки по факту являются CMF, а другие почти отдельный язык типа Си Шарп... Я тут недавно очень глубоко копал в ExBB и IPB. Несмотря на весь процедурно-файловый ховнокод в ExBB, блевать тянет намного больше от IPB...А потому что куча неявных непонятных связей и IDE нифига не показывает
виноват, исправлюсь Добавлено спустя 2 минуты 49 секунд: на самом деле эта песочница не импортирует никаких компонент, сталобыть компосер здесь нафиг не нужен. когда растащу на части, песочницу соответственно переделаю. Добавлено спустя 5 минут 49 секунд: Mr.M.I.T., с форумами просто беда. мне из того что трогал больше всего нравится fluxbb (форк старого punbb), хотя по нынешним временам он сильно устарел. зато сохранилась простота и единство стиля.
А xenforo качал? Помню как его называли самым крутым форумом, потому что на зенде написан ))))) вобщем я для себя давно вывод сделал - процедурник в едином стиле, с необходимым ООП там где это что-то дает.
не на зенде, а использует зенд. классы самого форума от зендовских не наследуют. кроме зенда в комплекте идет, например, sabre dav.
Я говорю как это преподносилось когда он вышел...а результат известно какой. Вот ты бы выбрал его, еслиб нужно было переписать часть форума и дописать новый функционал, в т.ч. в админке? ) У меня был выбор его или IPB...
Не хватает раздела с особенностями ) Чем оно отличается от ларки? Или скажем из своей поделки собранной композером на основе публичных компонент? Вопрос на самом деле чисто философский, т.к. тоже писал что-то подобное. Получилось довольно не плохо, а потом пришло осознание, что все это велосипед, который нужно поддерживать вместо того что бы писать непосредственно нужный функционал. з.ы. композер в комплекте сам по себе фича: во-первых рано или поздно все равно придется на него перебраться, во-вторых можно сразу из коробки догружать нужные компоненты. Оно конечно можно и так, но лучше с ним ))
как философ философу: "неплохо" пишется слитно. покажи своё?! было бы любопытно взглянуть на то, что ты успел сделать пока не вырос.
Я бы сам с удовольствием на это посмотрел, но к сожалению однажды оно в небытие. С тех пор я делаю архивы, коммиты и дампы на каждый чих )) Вообще, там был довольно неплохой query builder с зачатками orm`а в модельках, вполне реально позволяющий делать хитрую магию, автоматический роутинг сразу на методы контроллеров, кэширование, удобный вывод ошибок, ну и по мелочи. В целом не плохо, но сейчас бы переписал всё к чертям. А убила все начинания ларка: когда я раскурил её доки, то понял что это именно то к чему стремился, но гораздо веселее и логичнее. Хотя в целом не жалею, +1 к пониманию того, как оно всё работает под капотом. з.ы. граммар-наци! фy-фу-фу ))