Пользователи
Сущность User
Пользователи приложения Jmix определяются классом User
, который Studio автоматически создает в новом проекте. Это сущность JPA, реализующая интерфейс JmixUserDetails
, который имеет ряд методов, требуемых фреймворком:
-
getUsername()
возвращает уникальное имя пользователя. -
getPassword()
возвращает хэшированный пароль. -
isEnabled()
,isAccountNonExpired()
,isAccountNonLocked()
,isCredentialsNonExpired()
указывают, может ли пользователь войти в систему. -
getAuthorities()
,setAuthorities()
используются фреймворком для привязки пользователя к набору разрешений при входе в систему.
Пользователи хранятся в основной базе данных приложения. По умолчанию сущность User
и соответствующая таблица базы данных имеют следующие атрибуты:
-
id
,version
являются стандартными атрибутами первичного ключа и оптимистической блокировки. -
username
,password
,enabled
хранят значения, возвращаемые методами интерфейсаJmixUserDetails
. -
email
,firstName
,lastName
хранят дополнительную информацию о пользователях.
Вы можете определить любое количество дополнительных атрибутов, необходимых для приложения, например, department
или position
.
Управление пользователями
Новый проект содержит скрипт миграции базы данных 010-init-user.xml
, который создает пользователя с именем и паролем admin
/admin
и предоставляет ему полный доступ к приложению, связывая сущность с ролью system-full-access
.
Новый проект также содержит экраны UI для управления пользователями, см. Application → Users. Эти экраны позволяют создавать, редактировать и удалять пользователей, изменять и сбрасывать их пароли. Чтобы назначить роли пользователю, нажмите кнопку Role assignments в браузере пользователя.
Фреймворк содержит роль ui-minimal , которая дает разрешения на вход в UI и использование некоторых рядовых элементов UI. Назначьте эту роль новым пользователям, которые будут взаимодействовать с приложением через UI, так как в противном случае они не смогут войти в систему.
|
Встроенные пользователи
Любое приложение Jmix со стандартной подсистемой безопасности имеет два встроенных пользователя:
-
Пользователь Anonymous соответствует не прошедшим аутентификацию пользователям. Это позволяет предоставлять пользователю некоторые разрешения до того, как он войдет в систему.
-
Пользователь System требуется для механизма системной аутентификации. Он используется, когда нет реального пользователя, взаимодействующего с приложением, например, при его запуске или при вызове бизнес-метода планировщиком.
Встроенные объекты пользователей не хранятся в базе данных, а создаются при запуске приложения классом проекта DatabaseUserRepository
. Обоих пользователей можно настроить в методах initAnonymousUser()
и initSystemUser()
этого класса. По умолчанию системный пользователь связан с ролью system-full-access
и, следовательно, имеет все разрешения.
Анонимный пользователь по умолчанию не имеет никаких разрешений. Пример выдачи разрешений анонимному пользователю можно посмотреть в разделе Анонимный доступ к экранам.
Замещение пользователя
Системный администратор может предоставить пользователю возможность замещать другого пользователя. Замещение означает, что пользователь получает разрешения и ограничения замещенного пользователя. Например, если Алиса замещает Боба, она входит в приложение как Алиса, но выполняет роли Боба.
Чтобы увидеть функцию в действии, выполните следующие действия:
-
Войдите в систему как
admin
и создайте по крайней мере еще одного пользователя с рольюUI: minimal access
. -
Выберите
admin
в таблице Users и нажмите Additional → User substitution. Вы увидите список пользователей, которых может заместитьadmin
. -
Добавьте своего нового пользователя в список пользователей, которых замещает
admin
. -
Теперь вы увидите, что текущее имя пользователя в компоненте
userIndicator
главного экрана изменилось на выпадающий список, содержащий замещенного пользователя. Если его выбрать, рабочее пространство изменится, как если бы вы повторно вошли в систему как этот пользователь. Но все функции аудита зарегистрируютadmin
‒ вошедшего в систему пользователя.
Бин CurrentUserSubstitution
может использоваться для получения текущего замещенного пользователя, аутентифицированного или действующего пользователя (который в случае замещения является замещенным пользователем, а в противном случае аутентифицированным).
Например:
@Autowired
private CurrentUserSubstitution currentUserSubstitution;
private String getSubstitutedUserName() {
User substitutedUser = (User) currentUserSubstitution.getSubstitutedUser();
return substitutedUser == null ? "" : substitutedUser.getUsername();
}
-
Метод
CurrentAuthentication.getUser()
всегда возвращает аутентифицированного пользователя. -
CurrentAuthentication.getAuthentication().getAuthorities()
возвращает полномочия действующего пользователя. То есть в случае замещения эти полномочия отличаются от полномочий аутентифицированного пользователя.