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

Сущность 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. Назначьте эту роль новым пользователям, которые будут взаимодействовать с приложением через UI, так как в противном случае они не смогут войти в систему.

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

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

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

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

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

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

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

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

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

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

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

  3. Добавьте своего нового пользователя в список пользователей, которых замещает admin.

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