Несколько loginForm (login-view-id)

Здравствуйте.
jmix version ‘2.0.2’

Стоит задача в реализации нескольких экранов аутентификации: для “внешних” и “внутренних” пользователей.

  1. Способы аутентификации различные: 1. во внешней системе; 2. средствами jmix
  2. Набор данных для аутентификации различный (1. sms и пр.; 2. логин\пароль).
  3. У форм должна быть различная навигация (@Route)

Поэтому возник вариант реализации нескольких экранов.

Собственно вопросы:

  1. Возможна ли аутентификация в UI в нескольких вариантах?
  2. Возможно ли использование более одного login-view?
  3. Либо в loginForm делать @Route(value = {“login”, “login-internal”}) и внутри “рисовать” нужную форму в зависимости от route?

Добрый день.

Да, такое возможно. Например, у нас есть LDAP аддон, который позволяет входить в систему как обычным пользователям, так и ldap. Для Classic UI есть пример social login (https://github.com/jmix-framework/jmix-samples/tree/main/social-login-sample). Для Jmix 2.0+ примера пока нет, но принцип тот же.

Теоретически такое возможно, но для этого необходимо правильно настроить Spring Security Configuration, т.к. наша реализация предполагает наличие одной логин формы, см. io.jmix.securityflowui.FlowuiSecurityConfiguration#setLoginView(...), а так же переопределение io.jmix.securityflowui.access.UiViewAccessChecker, который так же предполагает наличие одной логин формы.

Я бы посоветовал для простоты изменить разметку единственной формы логина так, чтобы можно было выбирать, каким способом залогиниться в систему. Например добавить TabSheet и в нем 2 логин формы для разных способов

Screenshot 2023-10-12 at 13.20.45

Глеб

Глеб, благодарю за информацию.
Хотелось бы скрыть выбор для пользователей.

в loginForm делать @Route(value = {“login”, “login-internal”})

Теоретически такой вариант реализации будет работать?
Т.е. показывать\скрывать ui-элементы в зависимости от @Route?

@Route не поддерживает несколько значений, но можно использовать сколько угодно @RouteAlias аннотаций.

В beforeEnter можно узнать по какой URL пришли на экран:

@Override
public void beforeEnter(BeforeEnterEvent event) {
    Location location = event.getLocation();
    internalLogin = location.getPath().contains("internal-login");

    super.beforeEnter(event);
}

А в одном из обработчиков жизненного цикла экрана, например onInit, подстроить UI:

@Subscribe
public void onInit(final InitEvent event) {
    ...

    if (internalLogin) {
        // handle
    }
}

Здравствуйте,

@Route(value = "login")
@RouteAlias(value = "internal-login")
<...>
public class LoginView extends StandardView implements LocaleChangeObserver {

Location location = event.getLocation() в beforeEnter всегда прилетает location.getPath() = “login”

Ощущение, что где-то ранее происходит редирект.

Глеб, прокомментируйте, пожалуйста.

Попробуйте добавить @AnonymousAllowed на LoginView или более тонко настроить Spring Security, чтобы был анонимный доступ к internal-login роуту.