Пользователи

Сущность 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 для управления пользователями, см. ApplicationUsers. Эти экраны позволяют создавать, редактировать и удалять пользователей, изменять и сбрасывать их пароли. Чтобы назначить роли пользователю, нажмите кнопку Role assignments в экране списка пользователей.

Новый проект содержит роль ui-minimal, которая дает разрешения на вход в UI и главный экран. Назначьте эту роль новым пользователям, которые будут взаимодействовать с приложением через UI, так как в противном случае они не смогут войти в систему.
В примере User Registration показано, как можно реализовать самостоятельную регистрацию пользователей.

Встроенные пользователи

Любое приложение Jmix со стандартной подсистемой безопасности имеет два встроенных пользователя:

  • Пользователь Anonymous соответствует не прошедшим аутентификацию пользователям. Это позволяет предоставлять пользователю некоторые разрешения до того, как он войдет в систему.

  • Пользователь System требуется для механизма системной аутентификации. Он используется, когда нет реального пользователя, взаимодействующего с приложением, например, при его запуске или при вызове бизнес-метода планировщиком.

Встроенные объекты пользователей не хранятся в базе данных, а создаются при запуске приложения классом проекта DatabaseUserRepository. Обоих пользователей можно настроить в методах initAnonymousUser() и initSystemUser() этого класса. По умолчанию системный пользователь связан с ролью system-full-access и, следовательно, имеет все разрешения.

Анонимный пользователь по умолчанию не имеет никаких разрешений.

Замещение пользователя

Системный администратор может предоставить пользователю возможность замещать другого пользователя. Замещение означает, что пользователь получает ресурсные роли и роли уровня строк замещенного пользователя. Например, если Алиса замещает Боба, она входит в приложение как Алиса, но выполняет роли Боба.

Чтобы увидеть функцию в действии, выполните следующие действия:

  1. Войдите в систему как admin и создайте по крайней мере еще одного пользователя с ролью UI: minimal access.

  2. Выберите admin в таблице Users и нажмите Additional → User substitution. Вы увидите список пользователей, которых может заместить admin.

  3. Создайте новую запись с пользователем, которых замещает admin, затем нажмите OK в экране списка.

  4. Теперь вы увидите, что текущее имя пользователя в компоненте 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() возвращает полномочия действующего пользователя. То есть в случае замещения эти полномочия отличаются от полномочий аутентифицированного пользователя.