Authentication
Authentication — системный модуль, объявляющий пользователей приложения и всё, что связано с их входом в систему: классы пользователей и контактов, пароли и токены аутентификации, свойства текущего пользователя, локаль каждого пользователя, среду оформления и цветовую тему, внешних провайдеров аутентификации (LDAP, OAuth2), HTTP-эндпоинты для регистрации и восстановления пароля, действия управления сессией и блокировки объектов. Подключается через REQUIRE Authentication (сам делает REQUIRE Time, Utils).
Среда оформления
Среда оформления — это сущность, относительно которой хранятся персональные настройки интерфейса (раскладка навигатора, цветовая тема). Это либо текущий пользователь, либо текущий компьютер — в зависимости от флага storeNavigatorSettingsForComputer[].
| Класс / свойство | Что это |
|---|---|
DesignEnv | абстрактный базовый класс сред оформления; от него наследуются Computer и User |
currentDesignEnv[] | текущая среда оформления: currentComputer[] при установленном storeNavigatorSettingsForComputer[], иначе currentUser[] |
ColorTheme | статический класс с двумя объектами, light и dark |
designEnvColorTheme[DesignEnv] | цветовая тема, выбранная для среды оформления |
colorTheme[DesignEnv] | итоговая тема: designEnvColorTheme[DesignEnv], если задана, иначе clientColorTheme[DesignEnv] |
isDarkTheme[] | признак, что colorTheme[DesignEnv] текущей среды равна ColorTheme.dark |
name[ColorTheme] возвращает название темы; colorThemeName[DesignEnv] — название выбранной темы. Форма dialogColorThemes показывает две темы для выбора.
Компьютеры
| Класс / свойство | Что это |
|---|---|
Computer | клиентский компьютер (наследник DesignEnv) |
hostname[Computer] | имя хоста компьютера |
currentComputer[] | компьютер текущего соединения |
hostnameCurrentComputer[] | hostname[Computer] от currentComputer[] |
Форма computers показывает компьютеры (с созданием, редактированием и удалением); computersDialog — диалог выбора. Поиск computer[] находит последний компьютер по имени хоста.
Контакты
Contact — абстрактный класс, описывающий человека или организацию, по которым приложение хранит контактные данные. CustomUser наследуется от него, поэтому каждый способный к входу пользователь является и контактом.
| Свойство | Что хранит |
|---|---|
firstName[Contact] / lastName[Contact] | имя и фамилию |
name[Contact] | полное имя — firstName[Contact] и lastName[Contact], соединённые пробелом |
phone[Contact] | телефон |
postAddress[Contact] | почтовый адрес |
birthday[Contact] | дату рождения |
email[Contact] | адрес электронной почты, проверяемый по шаблону почтового адреса |
attributes[Contact, STRING] | произвольные дополнительные атрибуты по имени |
Поиск contact[STRING] находит контакт по адресу почты.
Пользователи
| Класс / свойство | Что это |
|---|---|
User | абстрактный базовый класс всех пользователей (наследник DesignEnv) |
SystemUser | пользователь, от имени которого платформа выполняет внутренние операции |
CustomUser | обычный пользователь со входом в систему; одновременно Contact |
name[User] | имя пользователя: фиксированное системное название для SystemUser, имя контакта для CustomUser |
login[CustomUser] | логин |
isLocked[CustomUser] | признак, запрещающий пользователю вход |
Поиски: customUserLogin[ISTRING] находит пользователя по логину (без учёта регистра), customUserEmail[ISTRING] — по адресу почты, isLockedLogin[ISTRING] сообщает, заблокирован ли пользователь с указанным логином.
Пароли и токены
| Свойство / действие | Что делает |
|---|---|
sha256Password[CustomUser] | SHA-256-хеш пароля пользователя |
changeSHA256Password[CustomUser] | запрашивает новый пароль и записывает его хеш в sha256Password[CustomUser] |
setSHA256Password[CustomUser, STRING] | хеширует переданный пароль и записывает его в sha256Password[CustomUser] |
passwordResetToken[CustomUser] / expiryPasswordResetTokenDate[CustomUser] | одноразовый токен сброса пароля и время его выдачи |
userByPassResetToken[STRING] | находит пользователя с указанным токеном сброса |
code2FA[CustomUser] / expiry2FA[CustomUser] / lastInitiated2FA[CustomUser] | текущий код двухфакторной проверки, срок его действия и время выдачи последнего кода |
getAuthToken[] | выгружает токен аутентификации текущего запроса (API-действие) |
generateAuthToken[User] / generateAuthToken[User, INTEGER] | выпускает новый токен аутентификации для пользователя, с необязательным сроком действия в минутах |
changeSHA256Password[CustomUser] подключён к форме customUser как обработчик изменения sha256Password[CustomUser]. Токены сброса старше часа очищаются действием clearPassResetToken[].
Текущий пользователь
currentUser[] — пользователь текущего соединения. currentUserName[] — это name[User] этого пользователя, а currentUserLogin[] — его login[CustomUser].
Провайдеры и настройки аутентификации
Модуль хранит настройки внешних механизмов аутентификации.
LDAP: useLDAP[] включает аутентификацию через LDAP; serverLDAP[], portLDAP[], baseDNLDAP[], userDNSuffixLDAP[], allowOnlyBaseDNUsers[], allowOnlyGroupUsers[] — настройки подключения и фильтрации. useDefaultAuthentication[] разрешает откатиться на встроенную парольную аутентификацию, когда LDAP недоступен, а disableEmailLoginFallback[] ограничивает поиск пользователя только логином (без поиска по почте). useServiceUser[], serviceUser[], serviceUserPassword[] задают служебную учётную запись для чтения каталога.
OAuth2 (роль клиента): приложение передаёт вход внешнему провайдеру (Google, GitHub и т. п.). Класс OAuth2 хранит настройку одного провайдера — id[OAuth2], clientId[OAuth2], clientSecret[OAuth2], clientAuthenticationMethod[OAuth2], scope[OAuth2], authorizationUri[OAuth2], tokenUri[OAuth2], jwkSetUri[OAuth2], userInfoUri[OAuth2], userNameAttributeName[OAuth2], clientName[OAuth2]. Поиск auth[STRING] находит провайдера по идентификатору. Действие writeDefaultCredentials[] создаёт стандартные записи провайдеров (GitHub, Google, Facebook, Yandex).
OAuth-сервер авторизации (роль сервера): приложение само выпускает токены, чтобы внешние приложения обращались к его API от имени пользователя.
| Класс / свойство | Что хранит |
|---|---|
OAuthClient | зарегистрированное внешнее приложение |
clientId[OAuthClient] / clientName[OAuthClient] | идентификатор и отображаемое имя клиента |
redirectURIs[OAuthClient] | разрешённые URI перенаправления (по одному на строку) |
trusted[OAuthClient] | признак, пропускающий для клиента экран согласия |
createdAt[OAuthClient] | время регистрации |
OAuthRefreshToken | выпущенный токен обновления |
token[OAuthRefreshToken] / client[OAuthRefreshToken] / user[OAuthRefreshToken] | токен, клиент, которому он выпущен, и пользователь, которого он представляет |
expiresAt[OAuthRefreshToken] / revokedAt[OAuthRefreshToken] | время истечения и время отзыва (пусто, пока токен действует) |
active[OAuthRefreshToken] | признак, что expiresAt[OAuthRefreshToken] ещё в будущем, а revokedAt[OAuthRefreshToken] пуст |
Поиски oauthClient[STRING] и oauthRefreshToken[STRING] находят клиента и токен обновления по их строковым ключам. Настройки сроков жизни токенов oauthAccessTokenExpiration[], oauthRefreshTokenExpiration[], oauthAuthCodeExpiration[] (в минутах) переопределяют встроенные значения по умолчанию, когда заданы. Форма oauthClient редактирует одного зарегистрированного клиента.
Веб-клиент: webClientSecretKey[] — общий секрет, который веб-клиент предъявляет, чтобы получить настройки провайдеров.
Настройки двухфакторной аутентификации
use2FA[] включает двухфакторную аутентификацию. twoFaRateLimitSeconds[] ограничивает, как часто можно запросить код, twoFaExpirySeconds[] — сколько выданный код действует, а twoFaMaxAttempts[] ограничивает число попыток проверки.
API-действия
Эти действия — HTTP-эндпоинты (помечены @@api); помеченные @@noauth доступны без предварительной аутентификации. Они читают входные данные из JSONFILE и записывают результат через EXPORT FROM.
| Действие | Что делает |
|---|---|
registerUser[JSONFILE] | создаёт CustomUser из логина, пароля, имени и почты, проверив надёжность пароля и уникальность логина |
resetPassword[JSONFILE] | выпускает токен сброса для пользователя, найденного по логину или почте, и отправляет письмо со ссылкой |
changePassword[JSONFILE] | задаёт новый пароль пользователю с указанным токеном сброса |
send2FACode[JSONFILE] | генерирует код двухфакторной проверки (с ограничением частоты) и отправляет его письмом |
verify2FACode[JSONFILE] | сверяет присланный код двухфакторной проверки с сохранённым и его сроком |
getClientCredentials[STRING] | возвращает настройки провайдеров OAuth2, если переданный секрет совпадает с webClientSecretKey[] |
getCurrentUserLocale[] | выгружает language[CustomUser] и country[CustomUser] текущего пользователя |
syncUsers[ISTRING, JSONFILE] | сверяет сохранённые клиентом логины, возвращая те, что существуют и не заблокированы |
getAuthToken[] | выгружает токен аутентификации текущего запроса |
onUserRegister[User] — абстрактный список действий, выполняемых для каждого вновь зарегистрированного пользователя, доступный для расширения.
Политика и надёжность пароля
| Свойство / действие | Что делает |
|---|---|
passwordMinLength[] | минимальная длина пароля (в группе policyStrengthPassword) |
passwordContainsDigits[] / passwordContainsSymbols[] / passwordContainsUpper[] | признаки, требующие цифр, специальных символов и заглавных букв |
weakPassword[STRING] | список невыполненных требований к паролю, либо пусто, если пароль им соответствует |
passwordStrength[STRING] | числовая оценка надёжности от 0 до 100 |
checkPasswordStrength[STRING] | абстрактное действие, записывающее passwordStrengthError[], когда пароль слишком слаб |
changePasswordOnNextLogin[CustomUser] | признак, заставляющий сменить пароль при следующем входе |
changePassword[CustomUser] / changePassword[] | интерактивный диалог смены пароля для указанного (или текущего) пользователя |
changePassword[CustomUser] открывает форму changePasswordUser, сверяет старый пароль с sha256Password[CustomUser], проверяет weakPassword[STRING] и совпадение подтверждения, и при успехе записывает новый хеш и снимает changePasswordOnNextLogin[CustomUser].
Настройки локали
Пользователь работает в итоговых языке, стране, часовом поясе, начале двузначного года и формате даты/времени. Каждое значение вычисляется из трёх слоёв: приоритет у собственного значения пользователя, затем значение по умолчанию приложения, затем значение сервера. Слой пользователя, в свою очередь, может уступить значениям, которые сообщает клиент.
Настройки идут параллельными группами:
- Пользователь (
userLanguage[CustomUser],userCountry[CustomUser],userTimeZone[CustomUser],userTwoDigitYearStart[CustomUser],userDateFormat[CustomUser],userTimeFormat[CustomUser]) — заданы явно для пользователя. - Клиент (
clientLanguage[CustomUser],clientCountry[CustomUser],clientTimeZone[CustomUser],clientDateFormat[CustomUser],clientTimeFormat[CustomUser]) — сообщены клиентом пользователя, используются только при включённом соответствующем флаге:useClientLocale[CustomUser]для языка/страны,useClientTimeZone[CustomUser]для часового пояса,useClientDateTimeFormat[CustomUser]для форматов. - По умолчанию (
defaultUserLanguage[],defaultUserCountry[],defaultUserTimezone[],defaultUserTwoDigitYearStart[],defaultUserDateFormat[],defaultUserTimeFormat[]) — общий для приложения запасной вариант. - Сервер (
serverLanguage[],serverCountry[],serverTimezone[],serverTwoDigitYearStart[],serverDateFormat[],serverTimeFormat[]) — последний запасной вариант.
Итоговые значения вычисляются так:
| Итоговое свойство | Порядок разрешения |
|---|---|
language[CustomUser] | язык клиента (при useClientLocale[CustomUser]), затем пользователя, по умолчанию, сервера |
country[CustomUser] | страна клиента (при useClientLocale[CustomUser] и сообщённом языке клиента), иначе страна первого непустого слоя из пользователя, по умолчанию, сервера |
timeZone[CustomUser] | часовой пояс клиента (при useClientTimeZone[CustomUser]), затем пользователя, по умолчанию, сервера |
dateFormat[CustomUser] / timeFormat[CustomUser] | формат клиента (при useClientDateTimeFormat[CustomUser]), затем пользователя, по умолчанию, сервера |
twoDigitYearStart[CustomUser] | значение пользователя, затем по умолчанию, затем сервера |
Управление сессией и пользователем
| Действие | Что делает |
|---|---|
logOut[] | завершает сеанс текущего пользователя, опционально перезапуская и переподключая клиент |
shutdown[] | выход без перезапуска и переподключения |
reconnect[] | выход с последующим перезапуском и переподключением |
restart[] | выход с перезапуском (используется действием выхода в навигаторе) |
relogin[CustomUser] | переаутентифицирует текущее соединение под указанным пользователем |
Блокировки объектов
Блокировка фиксирует, какой пользователь удерживает объект, чтобы два пользователя не редактировали его одновременно. locked[Object] — удерживающий пользователь. lock[Object] берёт блокировку в сериализуемой сессии, удаваясь только когда объект ещё не удерживается; unlock[Object] снимает её.
Диапазоны пикеров даты-времени
Каждый пользователь выбирает, какие предопределённые диапазоны показываются в пикерах одиночной даты и интервала дат. isDateTimeRangeSelected[DateTimePickerRanges, CustomUser] и isIntervalRangeSelected[DateTimeIntervalPickerRanges, CustomUser] — признаки выбора по каждому диапазону; больше семи каждого вида выбрать нельзя. setDefaultRanges[CustomUser] включает стандартный начальный набор и выполняется автоматически при создании CustomUser. Сами классы пикеров приходят из Time.
Формы и навигатор
| Форма | Назначение |
|---|---|
customUser | полная форма редактирования одного пользователя (логин, пароль, контакт, локаль, безопасность, диапазоны пикеров) |
customUsers | административная форма пользователей вместе с настройками локали, LDAP, OAuth2, 2FA, веб-аутентификации, OAuth-сервера и политики паролей |
customUsersDialog | диалог выбора пользователя |
editProfile | собственный профиль текущего пользователя (логин, имя, почта, язык) |
changePasswordUser | диалог смены пароля |
computers | список компьютеров |
В навигаторе появляются папка security (внутри System, содержит customUsers и computers) и папка верхнего уровня account с редактором профиля, действием смены пароля и действием выхода.
Язык
- Заголовок модуля — синтаксис
MODULE/REQUIRE; модульAuthenticationподключается черезREQUIRE Authentication. - Оператор
DATA— объявляет хранимые свойства пользователей, контактов и настроек.
Связано
System modules— общий перечень модулей платформы.Пользовательские классы— что такое абстрактные и статические классы, как их используютUser,ContactиColorTheme.Политика безопасности— как назначаются права доступа объявленным здесь пользователям.Security— отдельный модуль ролей и политик доступа.Service— административные и служебные действия.SystemEvents— события входа и подключения.Time— классы диапазонов пикеров и помощники по дате/времени.