Добрый день,
Скажите пожалуйста как перехватить событие смены пароля в форме (Сменить пароль пользователя) и вызвать сервис из бизнес логики?
Спасибо.
Добрый день,
Скажите пожалуйста как перехватить событие смены пароля в форме (Сменить пароль пользователя) и вызвать сервис из бизнес логики?
Спасибо.
Добрый день.
Чтобы перехватить нажатие кнопки Ok, т.е. коммит формы, необходимо переопределить экран sec$User.changePassword
. Чтобы это сделать, создайте новый экран и на вкладке Legacy Screen Templates выберите Extend an existing screen:
В поле Extend screen выберите change-password-dialog.xml: sec$User.changePassword
:
В контроллере созданного экрана переопределите метод changePassword
и сделайте свою реализацию:
import com.haulmont.cuba.gui.app.security.user.changepassw.ChangePasswordDialog;
import com.haulmont.cuba.security.entity.User;
import java.util.UUID;
public class ExtChangePasswordDialog extends ChangePasswordDialog {
@Override
public void changePassword() {
if (validateAll()) {
User targetUser;
UUID targetUserId;
if (user == null) {
targetUserId = userSession.getUser().getId();
targetUser = userSession.getUser();
} else {
targetUserId = user.getId();
targetUser = user;
}
String newPassword = passwField.getValue();
String passwordHash = passwordEncryption.getPasswordHash(targetUserId, newPassword);
userManagementService.changeUserPassword(targetUserId, passwordHash);
publishPasswordChangedEvent(targetUser, newPassword);
showNotification(getMessage("passwordChanged"), NotificationType.HUMANIZED);
close(COMMIT_ACTION_ID);
}
}
}
В зависимости от того, что сервис из бизнес логики должен сделать, возможно будет достаточно подписаться на UserPasswordChangedEvent
без переопределения экрана и отрегировать на изменение пароля в слушателе, например:
import com.haulmont.cuba.gui.app.security.events.UserPasswordChangedEvent;
import org.slf4j.Logger;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
@Component
public class UserPasswordChangedListener implements ApplicationListener<UserPasswordChangedEvent> {
@Inject
private Logger log;
@Override
public void onApplicationEvent(UserPasswordChangedEvent event) {
log.debug("UserPasswordChanged event is published");
}
}
Глеб
Спасибо большое за подробное описание, Вы мне очень помогли.
Все работает!