При выполнении пользовательских запросов программному коду Middleware через интерфейс
UserSessionSource
всегда доступна информация о текущем пользователе. Это возможно потому, что при получении запроса с клиентского уровня в
потоке выполнения автоматически устанавливается соответствующий объект
SecurityContext
.
Однако существуют ситуации, когда текущий поток выполнения не связан ни с каким пользователем системы: например, при вызове метода бина из планировщика, либо через JMX-интерфейс. Если при этом бин выполняет изменение сущностей в базе данных, то ему потребуется информация о том, кто выполняет изменения, то есть аутентификация.
Такого рода аутентификация называется системной, так как не требует участия пользователя - средний слой приложения просто
создает (или использует имеющуюся) пользовательскую сессию, и устанавливает в потоке выполнения соответствующий объект SecurityContext
.
Обеспечить системную аутентификацию некоторого участка кода можно следующими способами:
-
явно используя бин
com.haulmont.cuba.security.app.Authentication
, например:@Inject protected Authentication authentication; ... authentication.begin(); try { // authenticated code } finally { authentication.end(); }
-
добавив методу бина аннотацию
@Authenticated
, например:@Authenticated public String foo(String value) { // authenticated code }
Во втором случае также используется бин Authentication
, но неявно, через интерцептор AuthenticationInterceptor
, который перехватывает вызовы всех методов бинов с аннотацией @Authenticated
.
В приведенных примерах пользовательская сессия будет создаваться от лица пользователя, логин которого указан в свойстве приложения
cuba.jmxUserLogin
. Если требуется аутентификация от имени другого пользователя, нужно воспользоваться первым вариантом и передать в метод begin()
логин нужного пользователя.
Если в момент выполнения Authentication.begin()
в текущем потоке выполнения присутствует активная пользовательская сессия, то она не заменяется - соответственно, код, требующий
аутентификации, будет выполняться с имеющейся сессией, и последующий метод end()
не будет очищать поток.
Например, вызов метода JMX-бина из встроенной в Web Client консоли JMX, если бин находится в той же JVM, что и блок WebClient, к которому в данный момент подключен пользователь, будет выполнен от имени текущего зарегистрированного в системе пользователя, независимо от наличия системной аутентификации.