Стандартный вариант входа пользователя:
-
пользователь вводит свой логин и пароль
-
клиентский блок приложения хэширует пароль, вызывая метод
getPlainHash()
бинаPasswordEncryption
и вызывает на Middleware методLoginService.login()
, передавая ему логин пользователя и хэш пароля -
LoginService
делегирует выполнение бинуLoginWorker
, который загружает объектUser
по полученному логину, хэширует полученный хэш пароля повторно, используя в качестве соли идентификатор пользователя, и сравнивает полученный хэш с сохраненным в БД хэшем пароля. В случае несовпадения выбрасывается исключениеLoginException
. -
После успешной аутентификации в созданный экземпляр
UserSession
загружаются все параметры доступа данного пользователя: список ролей, права, ограничения и атрибуты сессии.
Алгоритм хэширования паролей реализуется бином типа EncryptionModule
и задается в свойстве приложения
cuba.passwordEncryptionModule
. По умолчанию - SHA-1.
Возможен вариант, когда пароль пользователя (точнее, хэш пароля) не хранится в базе данных, а проверяется внешними средствами,
например, путем интеграции с ActiveDirectory. В этом случае фактически аутентификацию выполняет клиентский блок, а Middleware "доверяет" клиенту, создавая сессию по одному только логину пользователя без пароля методом LoginService.loginTrusted()
. Метод loginTrusted()
требует выполнения следующих условия:
-
клиентский блок должен передать так называемый доверенный пароль, задаваемый на Middleware и на клиентском блоке свойством приложения cuba.trustedClientPassword
-
IP адрес клиентского блока должен соответствовать маске, задаваемой свойством приложения cuba.trustedClientPermittedIpMask
Вход в систему требуется также для автоматических процессов, запускаемых по расписанию, а также при подключении к бинам Middleware через JMX-интерфейс. Строго говоря, такие действия считаются административными и не требуют аутентификации до тех пор, пока не выполняется каких-либо изменений сущностей в базе данных. При записи сущностей в БД требуется проставить логин пользователя, который выполнил изменения, поэтому для работы таких процессов должен быть указан пользователь, от лица которого выполняются изменения.
Дополнительным плюсом входа в систему для автоматического процесса и для JMX-вызова является то, что вывод в журнал сообщений от логгеров сопровождается указанием логина текущего пользователя, если пользовательская сессия установлена в потоке выполнения. Это упрощает поиск сообщений от конкретного процесса при разборе журнала.
Вход в систему для процессов внутри Middleware выполняется вызовом LoginWorker.loginSystem()
с передачей логина пользователя (без пароля), от имени которого будет работать данный процесс. В результате создается объект
UserSession
, который будет закэширован в данном блоке Middleware и не будет реплицироваться в кластере.
Более подробно аутентификация процессов внутри Middleware рассмотрена в разделе Раздел 4.4.2, «Системная аутентификация»