
Простое решение для аутентификации пользователей внутри сверхпростого скелета платформы, которое работает «из коробки» (и поставляется с автоматическим установщиком), используя перспективную официальную реализацию хеширования/соления паролей bcrypt PHP 5.5+, а также некоторые приятные функции, которые значительно ускорят путь от идеи до первого пригодного к использованию прототипа приложения. Ничего больше. Этот проект ориентирован на хардкорную простоту. Все максимально просто, сделано для небольших проектов, типичной агентской работы и быстрых черновиков. Если вы хотите создавать масштабные корпоративные приложения со всеми функциями современных фреймворков, обратите внимание на Laravel, Symfony или Yii, но если вы просто хотите быстро создать что-то, что просто работает, тогда этот скрипт может быть вам интересен.
Архитектура HUGE, максимально простая, была вдохновлена несколькими докладами на конференциях, слайдами и статьями об огромных приложениях, которые – удивительно и намеренно – возвращаются к основам программирования, используя процедурное программирование, статические классы, чрезвычайно простые конструкции, не совсем DRY. код и т. д., сохраняя при этом чрезвычайно читаемый код (StackOverflow, Wikipedia, SoundCloud).
Несколько интересных модных словечек в этом контексте: KISS, YAGNI, Feature Creep, Минимально жизнеспособный продукт.
Чтобы этот проект оставался стабильным, безопасным, чистым и минималистичным, я решил свести разработку HUGE к минимуму. Не волнуйтесь, на самом деле это хорошо: новые функции обычно означают новые ошибки, множество тестов, исправлений, несовместимости, а для некоторых людей даже жесткий стресс при обновлении. Поскольку HUGE — это сценарий, критически важный для безопасности, новые функции не так важны, как стабильное и безопасное ядро, поэтому люди его используют. Это означает:
И если честно, поддерживать фреймворк бесплатно в мое редкое свободное время — это тоже не то, чем я хочу заниматься постоянно. :)
В заключение небольшое замечание: мир PHP сильно изменился, у нас есть отличные фреймворки с потрясающими функциями, большие профессиональные команды, очень хорошо написанная документация и большие сообщества, поэтому просто нет причин вкладывать много труда в другой фреймворк. Вместо этого, пожалуйста, используйте популярные фреймворки, тогда ваша работа будет иметь гораздо большее влияние и будет использоваться гораздо большим количеством людей!
Спасибо всем, кто участвует в этом проекте, приятного времяпрепровождения! КСОКСО, Крис
Еще в 2010/2011 году в мире PHP не было полезных решений для входа в систему, по крайней мере, для неспециалистов. Поэтому я совершил худшую ошибку, которую совершает каждый молодой разработчик: попытался создать что-то самостоятельно, не имея ни малейшего представления об основах безопасности. Что еще хуже, так это то, что в сети было (и есть) полно совершенно неработающих руководств по созданию систем аутентификации пользователей, даже крупнейшие компании в мире делали это совершенно неправильно (здесь мы говорим о SONY, LinkedIn и Adobe), и Кроме того, во многих основных средах на всех крупных языках программирования (!) используются совершенно устаревшие и небезопасные технологии сохранения паролей.
Однако в 2012 году эксперт по безопасности Энтони Феррара опубликовал небольшую библиотеку PHP, обеспечивающую чрезвычайно безопасное, современное и правильное хеширование паролей в PHP 5.3 и 5.4, которую может использовать каждый разработчик без какого-либо стресса и без каких-либо знаний о внутренних компонентах безопасности. Сценарий был настолько потрясающим, что был встроен в ядро PHP 5.5, который в наши дни является стандартом де-факто.
Когда она вышла, я попытался использовать эту голую библиотеку для создания полностью работающей готовой системы входа в систему для нескольких частных и коммерческих проектов и разместил код на GitHub. Многие люди нашли это полезным, внесли свой вклад и исправили ошибки в проекте, сделали его вилки, уменьшенные и увеличенные версии. Результатом стал этот проект.
Обратите внимание: сейчас, в 2015 году, большинство основных платформ имеют отличную логику аутентификации пользователей, встроенную по умолчанию. Это было не так много лет назад. Итак, с сегодняшней точки зрения, возможно, для серьезных проектов разумнее выбрать Laravel, Yii или Symfony. Но не стесняйтесь попробовать HUGE: автоматический установщик за считанные минуты установит полностью работающую установку без какой-либо настройки.
А почему название "ОГРОМНЫЙ"? Это хорошее сочетание с TINY, MINI и MINI2, MINI3, другими моими старыми проектами. Суперминиатюрные микрофреймворки для чрезвычайно быстрой и простой разработки простых веб-сайтов.
См. живую демонстрацию более старой версии 3.0 здесь и phpinfo() сервера здесь.
За этим проектом стоит большая работа. Я мог бы сэкономить вам сотни, а может быть, и тысячи часов работы (считайте это в затратах на разработку). Поэтому, когда вы зарабатываете деньги, используя HUGE, будьте честны и отдайте что-нибудь в пользу открытого исходного кода. HUGE абсолютно бесплатен для частного и коммерческого использования.
Поддержите проект, арендовав сервер в DigitalOcean или просто оставив чаевые за кофе на BuyMeACoffee.com. Спасибо! :)
Также не стесняйтесь внести свой вклад в этот проект.
Лицензия MIT. Абсолютно бесплатно для частных или коммерческих проектов.
Убедитесь, что вы знаете основы объектно-ориентированного программирования и MVC, умеете использовать командную строку и раньше использовали Composer. Этот скрипт не для новичков.
Эй, полностью автоматический. Почему ? Потому что я всегда ненавидел тратить дни на то, чтобы выяснить, как что-то установить. Это сэкономит вам массу времени и нервов. Пожертвуйте кофе, если он вам нравится.
Если вы используете Vagrant для своей разработки, то просто
vagrant box add ubuntu/trusty64vagrant up в этой папке.Через 5 минут у вас будет полностью установленная ОГРОМНАЯ версия Ubuntu 14.04 LTS. Полный код будет автоматически синхронизирован с текущей папкой. Пароль root MySQL и пароль root PHPMyAdmin установлены на 12345678 . По умолчанию 192.168.33.111 — это IP вашего нового ящика.
Чрезвычайно простая установка на свежий и голый типичный сервер Ubuntu 14.04 LTS:
Загрузите скрипт установщика
wget https://raw.githubusercontent.com/panique/huge/master/_one-click-installation/bootstrap.shСделайте его исполняемым
chmod +x bootstrap.shБеги! Дайте ему несколько минут на выполнение всех задач. И да, вы можете поблагодарить меня позже :)
sudo ./bootstrap.shComposer install в корневой папке приложения, чтобы установить зависимости.«Электронная почта не работает»? См. устранение неполадок ниже. TODO
Это всего лишь краткое руководство по простой настройке среды разработки!
Убедитесь, что у вас установлены Apache, PHP 5.5+ и MySQL. Учебник здесь. Nginx тоже наверняка будет работать, но руководств по установке пока нет.
Отредактируйте vhost, чтобы сделать возможным использование чистых URL-адресов, и направьте весь трафик в папку /public вашего проекта:
sudo nano /etc/apache2/sites-available/000-default.confи придайте файлу вид
<VirtualHost *:80>
DocumentRoot "/var/www/html/public"
<Directory "/var/www/html/public">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Включите mod_rewrite и перезапустите Apache.
sudo a2enmod rewrite
service apache2 restartУстановите curl (необходим для использования git), openssl (необходим для клонирования из GitHub, поскольку github поддерживает только https), PHP GD, графическую библиотеку (мы создаем капчи и аватары) и git.
sudo apt-get -y install curl
sudo apt-get -y install php5-curl
sudo apt-get -y install openssl
sudo apt-get -y install php5-gd
sudo apt-get -y install gitgit клон ОГРОМНЫЙ
sudo git clone https://github.com/panique/huge " /var/www/html "Установить Композитор
curl -s https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composerПерейдите в папку проекта, загрузите пакеты Composer (--dev не обязателен, вы знаете, в чем дело)
cd /var/www/html
composer install --devВыполните инструкции SQL. Например, через phpmyadmin или через командную строку. 12345678 — пример пароля. Обратите внимание, что это написано без пробела.
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/01-create-database.sql "
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/02-create-table-users.sql "
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/03-create-table-notes.sql "Сделайте папку аватара доступной для записи (убедитесь, что это правильный путь!)
sudo chown -R www-data " /var/www/html/public/avatars "Если это не работает для вас, вы можете попробовать сложный путь, установив альтернативный вариант
sudo chmod 0777 -R " /var/www/html/public/avatars "Удалить демо-файл Apache по умолчанию
sudo rm " /var/www/html/index.html "Отредактируйте конфигурацию приложения в application/config/config.development.php и введите учетные данные своей базы данных.
Последняя часть (не требуется для первого теста): укажите свои учетные данные SMTP в том же файле и установите для EMAIL_USE_SMTP значение true, чтобы вы могли отправлять правильные электронные письма. Для отправки почты настоятельно рекомендуется использовать SMTP! Собственная отправка через PHP mail() не будет работать почти во всех случаях (блокировка спама). Я использую SMTP2GO.
Затем проверьте IP/домен вашего сервера. Все должно работать нормально.
Это непроверенная установка NGINX. Пожалуйста, прокомментируйте билет, если вы видите проблемы.
server {
# your listening port
listen 80;
# your server name
server_name example.com;
# your path to access log files
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
# your root
root /srv/www/example.com/public_html;
# huge
index index.php;
# huge
location / {
try_files $uri /index.php?url=$uri&$args;
}
# your PHP config
location ~ .php$ {
try_files $uri = 401;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Большое спасибо razuro за эту прекрасную настройку: поместите это в свою корневую папку, но не помещайте web.config в свою общую папку.
<?xml version="1.0" encoding="UTF-8"?><configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="public/index.php?url={R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Оригинальный билет можно найти здесь.
По умолчанию есть два демонстрационных пользователя: обычный пользователь и пользователь-администратор. Для получения дополнительной информации ознакомьтесь с ролью пользователя в небольшом блоке документации внутри этого файла readme.
Обычный пользователь: имя пользователя — demo2 , пароль — 12345678 . Пользователь уже активирован. Пользователь-администратор (может удалять и блокировать других пользователей): имя пользователя — demo , пароль — 12345678 . Пользователь уже активирован.
В корневой папке проекта есть несколько файлов, которые могут раздражать:
README и CHANGELOG говорят сами за себя.
Настоящая документация находится в процессе создания. А пока, пожалуйста, взгляните на код и используйте функции завершения кода вашей IDE, чтобы понять, как все работает. Это совершенно очевидно, когда вы смотрите на файлы контроллера, файлы модели и на то, как данные отображаются в файлах представления. Очень жаль, что документации пока нет, но времени мало и мы все делаем это бесплатно в свободное время :)
В настоящее время существует два типа пользователей: обычные пользователи и администраторы. Есть точно такие же, но...
Пользователи с правами администратора могут удалять и блокировать других пользователей, у них есть дополнительная кнопка «администратор» в навигации. Пользователи с правами администратора имеют значение 7 в поле user_account_type таблицы базы данных. Они не могут повысить или понизить рейтинг своих учетных записей (поскольку это не имеет смысла).
Обычные пользователи точно не имеют функций администратора. Но они могут обновлять и понижать версию своих учетных записей (попробуйте это через /user/changeUserRole), что по сути является очень простой реализацией концепции базового пользователя/премиум-пользователя. Обычные пользователи имеют значение 1 или 2 в поле user_account_type таблицы базы данных. По умолчанию все новые зарегистрированные пользователи наверняка являются обычными пользователями с ролью пользователя 1.
Дополнительную информацию см. в разделе «Тестирование с использованием демо-пользователей» этого файла ознакомительных сведений.
Также есть очень интересный запрос на включение, добавляющий роли и права пользователей, который не интегрирован в проект, поскольку он слишком продвинут и сложен. Но, возможно, это именно то, что вам нужно, попробуйте.
Чтобы предотвратить атаки CSRF, HUGE делает это наиболее распространенным способом, используя токен безопасности, когда пользователь отправляет критические формы. Это означает: когда PHP отображает форму для пользователя, приложение помещает в форму «случайную строку» (как скрытое поле ввода), созданную с помощью Csrf::makeToken() (application/core/Csrf.php), которая также сохраняет этот токен в сеансе. При отправке формы приложение проверяет, содержит ли POST-запрос именно тот токен формы, который находится внутри сеанса.
Эта функция предотвращения CSRF в настоящее время реализована в процессе формы входа (см. application/view/login/index.php ) и процессе формы изменения имени пользователя (см. application/view/user/editUsername.php ), большинство других форм не являются безопасными. критичен и должен оставаться максимально простым.
Итак, чтобы сделать это с помощью обычной формы, просто: В вашей форме перед кнопкой отправки введите: <input type="hidden" name="csrf_token" value="<?= Csrf::makeToken(); ?>" /> Затем в действии контроллера проверьте токен CSRF, отправленный с формой, выполнив:
// check if csrf token is valid
if (!Csrf::isTokenValid()) {
LoginModel::logout();
Redirect::home();
exit();
}
Большое спасибо OmarElGabry за реализацию!
Теоретически: да, но в моих тестах эта функция не работала. Поскольку это внешняя функция, дополнительную информацию можно найти в соответствующем билете.
Есть несколько потрясающих функций или идей, созданных замечательными людьми, но эти функции слишком интересны, чтобы войти в основную версию HUGE, но если вам интересно, посмотрите эти заявки:
Идея этого проекта заключалась в том, чтобы предоставить супер-простое базовое приложение с полной системой аутентификации пользователей внутри, которая работает нормально и стабильно. Из-за высокой степени безопасности этого скрипта любые изменения означают большую работу, большое количество тестов, выявление крайних случаев и т. д., и в итоге я потратил 90% времени на тестирование и исправление новых функций или новые функции нарушают существующие. вещи, и делать это на самом деле не то, чем кто-то хочет заниматься бесплатно в редкое свободное время :)
Чтобы проект оставался стабильным, чистым и удобным в сопровождении, я хотел бы объявить о «мягком прекращении жизни» этого проекта, что означает:
A. HUGE не получит никаких новых функций в будущем, но... B. исправления и исправления будут внесены, вероятно, в течение многих лет
Пока HUGE находился в разработке, существовало 3 основных правила, которые помогли мне (и, возможно, другим) писать минимальный, чистый и работающий код. Возможно, вам тоже будет полезно:
Как отмечалось во введении к этому README, есть также несколько мощных концепций, которые могут помочь вам при разработке интересных вещей: KISS, YAGNI, Feature Creep, Минимально жизнеспособный продукт.
Чтобы избежать ненужной работы для всех нас, я бы порекомендовал всем использовать HUGE для простых проектов, которым нужны только те функции, которые уже существуют, и если вам действительно нужна архитектура RESTful, миграции, маршрутизация, 2FA и т. д., тогда это проще, чище и удобнее. быстрее просто использовать Laravel, Symfony или Zend.
Тем не менее, вот возможные функции, предложенные сообществом, взятые из множества заявок. Смело внедряйте их в свои форки проекта:
Существовало два (!) форума поддержки для v1 и v2 этого проекта (ОГРОМНЫМ является v3), и оба подверглись вандализму со стороны людей, которые даже не читали readme и/или инструкции по установке. Наиболее часто задаваемый вопрос был «скрипт не работает, пожалуйста, помогите», без предоставления какой-либо полезной информации (например, настройки кода или сервера или даже используемой версии). Пока я пишу эти строки, кто-то только что спросил в Твиттере: «Как установить без Composer». Вы понимаете, о чем я :) - 99% вопросов не были бы нужны, если бы люди прочитали рекомендации, провели минимальное исследование самостоятельно или перестали бы излишне усложнять ситуацию. И даже при написании подробных ответов большинство из них всё равно путались, что приводило к напыщенной речи и жалобам (за бесплатную поддержку свободного программного обеспечения!). Было просто неприятно сталкиваться с этим каждый день, особенно когда люди воспринимают как нечто само собой разумеющееся, что обязанность разработчиков открытого исходного кода — предоставлять подробную, бесплатную и персональную поддержку по каждому запросу «пожалуйста, помогите».
Поэтому я решил полностью прекратить любую бесплатную поддержку. Если у вас есть серьезные вопросы о реальных проблемах внутри скрипта, используйте функцию проблем GitHub.
Резкие слова, но поскольку в наши дни практически каждый публичный интернет-проект подвергается преследованиям, вандализму и троллингу со стороны очень странных людей, необходимо: Несколько простых правил.
Уважайте, это всего лишь простой сценарий, написанный бесплатными волонтерами в свободное время. Это НЕ бизнес-программное обеспечение, которое вы купили за 10 000 долларов. Нет причин жаловаться (!) на бесплатное программное обеспечение с открытым исходным кодом. Отношение к бесплатному программному обеспечению в наши дни действительно разочаровывает: люди принимают все как должное, не осознавая, какая работа стоит за этим, и тот факт, что они получают серьезное программное обеспечение совершенно бесплатно, экономя тысячи долларов. Если вам это не нравится, то не используйте его. Если вам нужна функция, попробуйте принять участие в процессе, возможно, даже создайте ее самостоятельно и добавьте в проект! Будьте милы и уважительны. Конструктивная критика, конечно, всегда приветствуется!
Не ругайте, не ненавидьте, не спамьте, не вандализируйте. Пожалуйста, не просите о личной бесплатной поддержке, не спрашивайте, может ли кто-нибудь сделать за вас вашу работу. Прежде чем что-то спросить, убедитесь, что вы прочитали README, выполнили все руководства, дважды проверили код и попытались решить проблему самостоятельно.
Тролли и очень назойливые люди получат постоянный бан/блокировку. У GitHub очень мощная команда по борьбе со злоупотреблениями.
Пожалуйста, делайте коммит только в ветке разработки . Основная ветка всегда будет содержать стабильную версию.
Scrutinizer (главная ветка), Scrutinizer (ветвь разработки), Code Climate, Codacy, SensioLabs Insight.
Из-за возможных последствий публикации ошибки в общедоступном проекте с открытым исходным кодом я прошу вас присылать действительно большие ошибки на мой адрес электронной почты, а не публиковать это здесь. Если ошибка не интересна злоумышленникам: смело создавайте обычную задачу на GitHub.
Посмотреть активные проблемы можно здесь: https://github.com/panique/huge/issues?state=open.
Интересная проблема: когда пользователь заходит на ваш сайт, браузер пользователя также запрашивает один или несколько (!) значков (разных размеров). Если эти статические файлы не существуют, ваше приложение начнет генерировать ответ 404 и страницу 404 для каждого файла. Это тратит много ресурсов сервера, а также бесполезно, поэтому убедитесь, что у вас всегда есть значки, или управляйте этим на уровне Apache/nginx.
HUGE пытается справиться с этим, отправляя пустое изображение в заголовок представления/_templates/header.php!
Подробнее в этом билете: возврат правильного 404 для отсутствующего favicon.ico, отсутствующих изображений и т. д.
Подробнее здесь, на Stackflow: Как предотвратить запросы favicon.ico? Разве это не глупо, что крошечный значок требует еще одного HTTP-запроса? Как превратить favicon в спрайт?
Я также веду блог на Dev Metal .