Skip to content

Latest commit

 

History

History
136 lines (102 loc) · 6.77 KB

File metadata and controls

136 lines (102 loc) · 6.77 KB

Билет №1. Сервер идентификации и авторизации

В этом билете необходимо будет реализовать бизнес-логику сервера идентификации и аутентификации

Обзор проекта

В этом репозитории находится незавершенный исходный код проекта 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

По желанию можно написать юнит-тесты.