В этом билете необходимо будет реализовать бизнес-логику сервера идентификации и аутентификации
В этом репозитории находится незавершенный исходный код проекта Auth Server, имитирующего сетевые приложения, которые обычно называются серверами аутентификации (Kerberos, Radius и др.).
Сервер открывает UDP сокет на указанном порту и обрабатывает входящие сообщения. Каждое сообщение интерпретируется сервером как команда, которую он выполняет и отправляет на нее ответ.
-
Открыть сессию (login).
Аргументы: имя пользователя и его пароль.
Если сервер находит имя пользователя в своем внутреннем хранилище, и пароль этого пользователя совпадает с переданным в аргументе, то сервер формирует уникальное числовое значение идентификатора сессии, которое отправляет в ответ. Это единственная команда, которую можно выполнить без идентификатора сессии. -
Закрыть сессию (logout).
Аргументы: идентификатор сессии.
Если сервер находит сессию по ее идентификатору в своем внутреннем хранилище, то он удаляет эту сессию, таким образом, закрывая её. -
Добавить пользователя (adduser).
Аргументы: идентификатор сессии, имя нового пользователя и пароль нового пользователя.
Сначала сервер находит сессию по ее идентификатору в своем внутреннем харинилище. Если она нашлась и принадлежит администратору, то сервер добавляет нового пользователя в свое внутреннее хранилище. -
Удалить пользователя (deluser).
Аргументы: идентификатора сессии, имя удаляемого пользователя.
Сначала сервер находит сессию по ее идентификатору в своем внутреннем харинилище. Если она нашлась и принадлежит администратору, то сервер удаляет пользователя с именем из аргументов команды.
Администратор - это специальный пользователь с повышенными привилегиями. В Auth Server он существует в единственном экземпляре и создается во время старта сервера. Имя администратора и его пароль передаются в аргументах командной строки.
-
Сервер не использует базу данных и не сохраняет состояние в ПЗУ.
-
Сервер не поддерживает шифрование входящих и исходящих сообщений.
-
UDP был выбран, потому что для него проще и быстрее написать корректный код, чем для TCP. В реальном проекте нужно было бы использовать TCP или HTTPS.
-
Сервер хранит пароли в открытом виде, чтобы не добавлять зависимость от OpenSSL или другой криптографической библиотеки. В настоящем проекте это было бы недопустимо.
-
Проект не кроссплатформенный, соберется только под POSIX-совместимую операционную систему.
Для сборки проекта выполните:
cmake -B build/
cmake --build build/Вручную проект можно протестировать в терминале.
Потребуется утилита nc.
В одном окне терминала запустите сервер на каком-либо порту (в примере 9000):
./build/auth_server admin password 9000
Add administrator user 'admin/***'
Listening on port 9000
...В другом окне терминала подключитесь к серверу и попробуйте залогиниться:
nc -u 127.0.0.1 9000
invalid
error: unknown command
login admin
error: invalid arguments number
login admin password
not implementedПоскольку в текущей реализации сервер незавершен, то залогиниться не получится. Завершить работу обеих программ можно нажав Ctrl+C.
Что уже реализовано:
- разбор аргументов командной строки;
- UDP сервер (прием команд, отправка ответов);
- разбор (десериализация) команд, их аргументы складываются
в готовые структуры (пространство имен
auth::server::argsиз commands.hpp); - система сборки.
Что нужно реализовать:
- набор функций/классов для хранения пользователей, сессий (в auth.cpp и auth.hpp);
- набор функций/классов для реализации команд (в auth.cpp и auth.hpp);
- добавление суперпользователя (server.cpp);
- обработку команд (server.cpp).
Места, где в коде нужно внести изменения, помечены комментариями TODO:
// TODO: обработайте команду loginПо желанию можно написать юнит-тесты.