Python: Авторизация в базе пользователей

From EjudgeWiki

Навигация: Главная страница/Система ejudge/Расширение/Доступ к ejudge из программ на Питоне/Работа с базой пользователей/Авторизация в базе пользователей.

В системе ejudge различается несколько уровней привилегий пользователей:

  • Обычный пользователь. Для него доступны только возможности, заданные в конфигурационном файле турнира.
  • Координатор, проверяющий, старший проверяющий. Имеют ограниченные возможности по ручной проверке решений и по назначению проверяющих на проверку решений. В данный момент эти привилегии не реализованы до конца.
  • Судья. Имеет возможность использовать административный интерфейс new-judge. Точные полномочия для судьи устанавливаются с помощью бит полномочий в конфигурационном файле турнира. В частности, к судьям относятся и наблюдатели, которые могут следить за ходом турнира, но не могут в него вмешиваться.
  • Администратор. Имеет возможность использовать административный интерфейс new-master. Точные полномочия для администраторов устанавливаются с помощью бит полномочий в конфигурационном файле турнира.

Авторизация выполняется один раз при работе с сервером. Уже авторизованное соединение не может быть авторизовано по-другому.

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

Для обычных пользователей различаются два вида авторизации: общая авторизация и авторизация на конкретный турнир. Общая авторизация производится при создании новых пользователей, регистрации пользователя на турнир и т. п., то есть при выполнении операций в программе new-register. Авторизация на конкретный турнир выполняется при входе в программу new-client. Авторизация на турнир может требовать отдельного пароля, накладывать другие ограничения на IP-адреса и т. д. Поэтому для участия в турнире (сдачи задач, просмотра текущих результатов и т. д.) необходима турнирная авторизация. Для изменения регистрационных настроек необходима регистрационная авторизация.

И для обычных пользователей, и для привилегированных пользователей авторизация проводится либо по паре логин-пароль, либо по сессионному ключу. Сессионный ключ генерируется при авторизации по логину. Сессионный ключ действителен 24 часа.

Далее кратко рассматриваются поддерживаемые запросы на авторизацию соединения.

Авторизация обычных пользователей

login

Для регистрационной авторизации по логину и паролю используется метод login

res = clnt.login(ip_str, ssl_flag, contest_id, locale_id, login, password)

Идентификатор турнира может быть равен 0. Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res - это словарь следующего вида:

{ 'user_id' : user_id, 'sid' : sid, 'name' : name }

Возвращаемое имя пользователя name соответствует указанному турниру contest_id.

loginBySID

Метод используется для регистрационной авторизации непривилегированного пользователя по сессионному ключу

res = clnt.contestLoginBySID(ip_str, ssl_flag, contest_id, sid)

Идентификатор турнира может быть равен 0. Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res - это словарь следующего вида:

{ 'user_id' : user_id, 'locale_id' : locale_id, 'login': login, 'name' : name }

Возвращаемое имя пользователя name соответствует указанному турниру contest_id.

contestLogin

Для турнирной авторизации по логину и паролю используется метод contestLogin

res = clnt.contestLogin(ip_str, ssl_flag, contest_id, locale_id, login, password)

Идентификатор турнира не может быть равен 0. Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res - это словарь следующего вида:

{ 'user_id' : user_id, 'sid' : sid, 'name' : name }

Возвращаемое имя пользователя name соответствует указанному турниру contest_id.

contestLoginBySID

Метод используется для авторизации непривилегированного пользователя на турнир по сессионному ключу

res = clnt.contestLoginBySID(ip_str, ssl_flag, contest_id, sid)

Идентификатор турнира не может быть равен 0. Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res - это словарь следующего вида:

{ 'user_id' : user_id, 'locale_id' : locale_id, 'login': login, 'name' : name }

Возвращаемое имя пользователя name соответствует указанному турниру contest_id.

Авторизация привилегированных пользователей

adminProcess

Для авторизации с правами администратора на основе полномочий системы linux можнно использовать метод adminProcess

res = clnt.adminProcess()

Для авторизации используется идентификатор пользователя linux. Пользователи linux отображаются в пользователей ejudge с помощью отображения пользователей в конфигурационном файле ejudge.xml. Если операция завершилась успешно, то res - это словарь следующего вида:

{ 'user_id' : user_id, 'sid' : sid, 'name' : name }

Возвращаемое имя пользователя name соответствует турниру по умолчанию (турнир 0).

privLogin

Для авторизации с правами администратора по логину и паролю используется метод privLogin

res = clnt.privLogin(ip_str, ssl_flag, contest_id, locale_id, priv_role, login, password)

Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res - это словарь следующего вида:

{ 'user_id' : user_id, 'sid' : sid, 'priv_level' : priv_level, 'name' : name }

Возвращаемое имя пользователя name соответствует указанному турниру contest_id. В результате авторизации уровень привилегий может быть понижен. Например, если был запрошен уровень привилегий ADMIN, а пользователь имеет только уровень привилегий JUDGE, будет установлен уровень привилегий JUDGE и это значение будет возвращено в priv_level.

privLoginBySID

Для авторизации с правами администратора по сессионному ключу используется метод privLoginBySID.

res = clnt.privLoginBySID(ip_str, ssl_flag, contest_id, sid, priv_level)

Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res - это словарь следующего вида:

{ 'user_id' : user_id, 'contest_id' : contest_id, 'locale_id' : locale_id, 'priv_level' : priv_level,
  'login' : login, 'name' : name }

Возвращаемое имя пользователя name соответствует указанному турниру contest_id.