В этом примере я покажу вам, как создать простую систему входа в систему для веб-приложения с использованием Gin HTTP Web Framework для Golang.

Здесь я представляю пример простого веб-приложения для проверки концепции с системой входа в систему и управлением сеансами. Он написан на языке Go (Golang) и использует Gin HTTP Web Framework. Пример, приведенный здесь, можно легко расширить.

То, как я структурировал код, было вдохновлено тем, как Ахил Шарма структурировал код для своего примера «Ресторанный бэкэнд управления». Кроме того, некоторые коды аутентификации, входа и выхода были адаптированы из примера аутентификации Depado. Остальное основано на моих предыдущих статьях. Ссылки на них см. в конце статьи.

Предпосылки

При отладке убедитесь, что кэш HTTP отключен. Это также требует, чтобы Inspector или DevTools были открыты во время отладки.

  • Если вы используете Firefox Inspector, перейдите в настройки, найдите дополнительные настройки и установите флажок «Отключить HTTP-кэш (когда панель инструментов открыта)».
  • Для Chrome DevTools перейдите в «Настройки», найдите «Настройки сети» и установите флажок «Отключить кэш (пока открыт DevTools)».

Структура каталогов

На приведенном выше снимке экрана вы можете увидеть расположение файлов и каталогов проекта. Каталоги, которые вы видите здесь, в свою очередь, являются подкаталогами каталога с именем /gin_session_auth. Это важно отметить, так как это также название проекта.

При обращении к пакетам мы всегда начинаем с имени проекта, а затем добавляем имя пакета. Например, если вы хотите обратиться к пакету controllers, вы должны написать "gin_session_auth/controllers". Вы увидите это в импорте файлов, перечисленных ниже.

глобальные/globals.go

Во-первых, мы определяем несколько глобальных переменных. Те, которые мы определяем здесь, используются для управления сеансом.

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

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

main.go

Это основная функция, которая запускает весь проект. См. мою предыдущую статью для получения информации об основах загрузки HTML-шаблонов с помощью Gin. Здесь я рассмотрю некоторые дополнительные концепции, не представленные в этой статье.

В строках 4 и 5 мы импортируем промежуточное ПО Sessions для Gin. В этом случае мы будем сохранять данные сеанса с помощью бэкэнда Cookie. Это промежуточное программное обеспечение также предоставляет другие бэкенды, такие как Redis, MongoDB, memstore и т. д. Посетите страницу Github для промежуточного программного обеспечения Sessions здесь.

В строках 10–12 мы импортируем некоторые пакеты, которые мы определили сами в другом месте этого проекта (см. обсуждения в заголовках ниже).

В строке 21 мы указываем маршрутизатору Gin использовать промежуточное программное обеспечение Session и безопасный сервер cookie. Переменная globals.Secret содержит ключ аутентификации для безопасного файла cookie.

В строках 23 и 24 мы создаем группу маршрутизаторов для общедоступных маршрутов.

В строках 26–28 мы создаем группу маршрутизаторов для частных маршрутов. Кроме того, мы советуем этой группе использовать промежуточное ПО аутентификации. Это промежуточное ПО будет запущено до того, как будут запущены фактические обработчики. Следовательно, мы можем проверить, прошел ли пользователь аутентификацию, прежде чем разрешить ему просматривать частные веб-страницы.

маршруты/routes.go

Здесь мы вызываем обработчики из пакета controllers. Для каждого разрешенного маршрута мы определяем функцию обработки HTTP.

Вход в систему и доступ к индексной странице веб-приложения не требует аутентификации; следовательно, эти маршруты определены в функции PublicRoutes().

С другой стороны, посещение информационной панели требует, чтобы пользователь был авторизован. Кроме того, не имеет особого смысла выходить из системы, если пользователь еще не прошел аутентификацию. Эти маршруты определены в функции PrivateRoutes().

контроллеры/handlers.go

В этом файле мы определяем все обработчики для HTTP-маршрутов.

В строках 14–31 мы обрабатываем действия для маршрута HTTP GET /login. Если пользователь все еще вошел в систему, его просят сначала выйти из системы, прежде чем войти в систему. В любом случае HTML-шаблон с именем login.html отображается, а затем возвращается в качестве ответа Gin с помощью функции HTML().

Ответ содержит форму, запрашивающую имя пользователя и пароль. Когда пользователь предоставляет их и нажимает кнопку отправки, в наше веб-приложение отправляется HTTP-запрос POST.

В строках 33–63 обработчик обрабатывает запрос POST для маршрута /login. Если пользователь уже вошел в систему, его сначала попросят выйти из системы.

Если пользователь не вводит имя пользователя или пароль, его просят это сделать. Вспомогательная функция EmptyUserPass() проверяет это за нас. Затем, если пользователь вводит несуществующую комбинацию имени пользователя или пароля, ему сообщается, что они неверны.

Проверка пароля выполняется вспомогательной функцией CheckUserPass(). Наконец, если сессия не может быть сохранена, пользователь уведомляется об этом.

Когда все идет хорошо, пользователь перенаправляется на свой дашборд с помощью функции Redirect() из фреймворка Gin.

В более реалистичных условиях имена пользователей и пароли проверялись бы не только на пустоту, но и по другим критериям, таким как длина и тип символов, которые они включают. Это потребует более сложных функций проверки.

В строках 65–82 мы реализуем функцию выхода из системы для маршрута /logout. Сначала извлекается текущая сессия. Если этот сеанс не существует, регистрируется сообщение об ошибке, и больше ничего не происходит. В противном случае текущая сессия удаляется и сохраняется. Сообщение об ошибке регистрируется, если новый пустой сеанс не может быть сохранен. Наконец, пользователь перенаправляется на главную страницу по адресу /.

В строках 84–93 и 95–104 реализованы обработчики индексной страницы и дашборда соответственно. Эти обработчики делают примерно то же самое. Они извлекают текущий сеанс и извлекают пользователя, а затем возвращают обработанный HTML-шаблон либо для индекса, либо для информационной панели. Имя пользователя используется в шаблонах.

промежуточное ПО/authRequired.go

Промежуточное ПО для проверки подлинности пользователя реализовано в этом файле. Он просто проверяет, существует ли сеанс. Если сеанс нулевой, пользователь перенаправляется на маршрут /login. В противном случае инфраструктуре Gin предлагается перейти к следующему шагу.

В этом случае следующим шагом будет один из обработчиков, который обрабатывает один из приватных маршрутов. С другой стороны, если были установлены другие функции промежуточного программного обеспечения, то следующим шагом может быть одна из этих функций.

помощники / helpers.go

Вот несколько вспомогательных функций.

В строках 8–25 мы реализуем функцию, которая проверяет имя пользователя и пароль. Здесь мы сохраняем простоту и определяем две возможные комбинации имени пользователя и пароля; привет+итсме и джон+доу.

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

В строках 27–29 имя пользователя и пароль проверяются, чтобы убедиться, что они не пусты.

HTML-шаблоны

Вы можете увидеть все шаблоны HTML, используемые в этом проекте выше. Вот несколько замечаний:

  • В строке 10 загружается Bulma CSS Framework.
  • В строках 22–48 добавлен код Javascript для обеспечения некоторых функций Bulma. В частности, скрипт позволит пользователям щелкнуть гамбургер, чтобы сделать меню панели навигации видимым. Подробнее об этом здесь.

Ознакомьтесь со ссылками ниже, чтобы узнать больше о шаблонах HTML, Gin и Golang.

Рекомендации

Документация по Bulma CSS Framework

«Сессии для Джина на Github»

«gin-auth-example от Depado на Github»

«golang-restaurant-management-backend от AkhilSharma90 на Github»

Как использовать шаблоны в Голанге, Джес Финк-Дженсен»

Как генерировать HTML с помощью шаблонов Golang, Джес Финк-Дженсен»

Как визуализировать HTML-страницы с помощью Gin для Golang, Джес Финк-Дженсен»