loginForm
Компонент loginForm получает учётные данные и дополнительные параметры аутентификации.
XML-элемент |
|
|---|---|
Java-класс |
|
Основы
Базовая форма loginForm содержит поля имени пользователя и пароля, а также кнопку входа. Кроме того, она может отображать выбор локали, флажок Запомнить меня и кнопку Забыли пароль?.
Надписи и сообщения
Во вложенном элементе form задаются заголовок формы, подписи полей и текст кнопки. Значения можно указать напрямую или получить по ключам из message-bundle. В примере также задаются содержимое errorMessage для ошибки аутентификации и additionalInformation под формой:
<loginForm>
<form title="Welcome"
username="Username or email"
password="Password"
rememberMe="Remember me"
submit="Log in"
forgotPassword="Forgot password"/>
<errorMessage title="Login failed"
message="Check that you have entered the correct username and password and try again"/>
<additionalInformation message="Additional information"/>
</loginForm>
Необязательные элементы
Атрибуты видимости позволяют показать или скрыть выбор локали, флажок Запомнить меня и кнопку Забыли пароль?, не изменяя содержимое вложенного элемента form:
<loginForm localesVisible="true"
rememberMeVisible="true"
forgotPasswordButtonVisible="true">
//...
</loginForm>
Запоминание пользователя
Параметр Запомнить меня сохраняет в браузере постоянный токен, поэтому аутентифицированный сеанс может продолжаться после завершения HTTP-сеанса и перезапуска приложения. При аутентификации получайте состояние флажка из LoginEvent. Если интерфейс должен сразу реагировать на изменение флажка, используйте RememberMeChangedEvent.
Подробное описание механизма аутентификации см. в документации Spring Security по функции Remember Me.
Аутентификация
Стандартный экран входа подписывается на LoginEvent, применяет выбранную локаль и передаёт введённые учётные данные и состояние Запомнить меня в AuthenticationManager. Ошибки аутентификации отображаются через состояние ошибки формы:
@ViewComponent
private JmixLoginForm login; (1)
@Subscribe("login")
public void onLogin(final LoginEvent event) {
try {
loginViewSupport.authenticate(
AuthDetails.of(event.getUsername(), event.getPassword())
.withLocale(login.getSelectedLocale()) (2)
.withRememberMe(login.isRememberMe()) (3)
);
} catch (final BadCredentialsException | DisabledException | LockedException | AccessDeniedException e) {
log.info("Login failed", e);
event.getSource().setError(true);
}
}
| 1 | Инжектирует форму, чтобы контроллер мог обновлять её состояние. |
| 2 | Применяет локаль, выбранную в форме. |
| 3 | Передаёт состояние флажка в токен аутентификации. |
Обработка исключений
Расширьте обработчик входа, если пользователю нужно сообщить конкретную причину ошибки аутентификации. В примере определяется заблокированная учётная запись, выводится соответствующее сообщение и регистрируется неудачная попытка входа:
@Subscribe("login")
public void onLogin(final AbstractLogin.LoginEvent event) {
try {
loginViewSupport.authenticate(
AuthDetails.of(event.getUsername(), event.getPassword())
.withLocale(login.getSelectedLocale())
.withRememberMe(login.isRememberMe())
);
}
catch (final BadCredentialsException | DisabledException | LockedException | AccessDeniedException e) {
if (e instanceof LockedException) {
JmixLoginI18n loginI18n = createLoginI18n();
loginI18n.getErrorMessage().setMessage(e.getMessage()); (1)
login.setI18n(loginI18n);
} else {
login.setI18n(createLoginI18n());
}
log.warn("Login failed for user '{}': {}", event.getUsername(), e.toString()); (2)
event.getSource().setError(true);
}
}
| 1 | Выбирает сообщение об ошибке для LockedException. |
| 2 | Записывает неудачную попытку входа в журнал. |
Стилизация экрана входа в систему
В примере дескриптор формы используется вместе с CSS, ограниченным областью компонента. XML задаёт содержимое формы входа, а CSS — окружающий макет, фоновое изображение и положение формы:
<div classNames="custom-login">
<loginForm id="login"
rememberMeVisible="false"
forgotPasswordButtonVisible="false"
localesVisible="false">
<form title="Custom Login Sample"
username="Username"
password="Password"
rememberMe="Remember me"
submit="Log in"
forgotPassword="Forgot password"/>
</loginForm>
</div>
.custom-login {
width: 100%;
background-image: url("background.png");
background-position: center;
background-size: cover;
display: flex;
height: 25em;
}
.custom-login jmix-login-form {
align-items: center;
display: flex;
max-width: 25em;
background-color: var(--lumo-base-color);
}
.custom-login vaadin-login-form-wrapper {
background-image: none;
}
Атрибуты
loginForm имеет следующие уникальные атрибуты:
| Имя | Описание | По умолчанию |
|---|---|---|
Отображает кнопку Забыли пароль?. |
|
|
Отображает выбор локали. |
|
|
Отображает флажок Запомнить меня. |
|
loginForm имеет следующие общие атрибуты:
Обработчики
loginForm имеет следующие уникальные обработчики:
| Имя | Описание |
|---|---|
Запускается, когда пользователь нажимает Забыли пароль. |
|
Запускается, когда пользователь выбирает другую локаль. |
|
Запускается, когда пользователь отправляет введённые учетные данные. |
|
Вызывается при изменении состояния флажка Запомнить меня. |
|
Предоставляет метку, отображаемую для каждого языкового стандарта в селекторе. |
loginForm имеет следующие общие обработчики:
Элементы
loginForm может содержать элементы form, errorMessage и additionalInformation. Элемент form задаёт подписи и текст кнопки, errorMessage — содержимое при ошибке аутентификации, а additionalInformation — дополнительное содержимое под формой.