Я пытаюсь проверить имя пользователя и пароль пользователя из бэкэнда keycloak, потому что у меня есть специальная форма аутентификации. Я использовал приведенный ниже код для проверки пользователя, который работает должным образом.
private UserModel getUserByUserNameAndPassword(AuthenticationFlowContext context, String username,
String password) {
RealmModel realm = context.getRealm();
UserModel user = context.getSession().users().getUserByUsername(realm, username);
if (user != null) {
context.setUser(user);
context.success();
}
return user;
}
Но я не могу проверить пароль этого пользователя. Может ли кто-нибудь помочь мне использовать пароль для проверки пользователя.
Заранее спасибо.
@ maio290 Спасибо за ответ. Я на стороне keycloak, я изменил страницу входа в keycloak, указав номер мобильного телефона и OTP. клиентские приложения используют это. Но теперь в некоторых ситуациях мне также нужно добавить форму имени пользователя и пароля. Итак, теперь нужно изменить внутренний код.
Что делать, если пользователь вошел в систему через социальный провайдер? У Keycloak нет для этого учетных данных, только токен.
Основная проблема, с которой вы, вероятно, столкнетесь на пути реализации, заключается в том, что вы пытаетесь сравнить пароль в виде открытого текста с хешированным и соленым паролем.
Учитывая, что один из их интеграционных тестов выглядит так: [Источник]:
UserProvider userProvider = session.getProvider(UserProvider.class);
UserModel user = userProvider.getUserByUsername(userName, realm);
return userProvider.validCredentials(session, realm, user, UserCredentialModel.password(password));
Вы должны быть в состоянии сделать следующее:
UserProvider userProvider = context.getSession().getProvider(UserProvider.class);
UserModel user = userProvider.getUserByUsername(userName, context.getRealm());
final booolean isValidPassword = userProvider.validCredentials(context.getSession(), context.getRealm(), user, UserCredentialModel.password(password));
Спасибо @mario290, но функция validCredentials
, похоже, недоступна в UserProvider
. Получаю ошибку типа "The method validCredentials(KeycloakSession, RealmModel, UserModel, PasswordUserCredentialModel) is undefined for the type UserProvider
". Но UserCredentialModel.password(password)
может мне помочь. Я буду отлаживать это.
@Prifulnath В случае сомнений просто найдите методы в их репозитории GIT. Просто пытался помочь. Надеюсь, вы добьетесь того, чего пытаетесь реализовать, удачи! :)
Вот решение сработало для меня. Я использовал функцию validatePassword
в классе AbstractUsernameFormAuthenticator
.
Мой параметр формы inputData
from предоставляет имя пользователя и пароль.
private UserModel getUserByUserNameAndPassword(AuthenticationFlowContext context, String username) {
RealmModel realm = context.getRealm();
UserModel user = context.getSession().users().getUserByUsername(realm, username);
MultivaluedMap<String, String> inputData = context.getHttpRequest().getDecodedFormParameters();
boolean shouldClearUserFromCtxAfterBadPassword = !isUserAlreadySetBeforeUsernamePasswordAuth(context);
if (user != null
&& validatePassword(context, user, inputData, shouldClearUserFromCtxAfterBadPassword)) {
return user;
} else {
return null;
}
}
Возможно, я совершенно ошибаюсь, так как много лет назад работал с Keycloak, но я думаю, вы пытаетесь использовать Keycloak таким образом, что это не имеет особого смысла. Если у вас есть только аутентификация на основе имени пользователя и пароля и вы все равно разработали собственные формы, мне кажется неправильным подход использовать здесь Keycloak, если вы не собираетесь работать с предоставленными им токенами. Обычно для аутентификации пользователя не следует использовать пароль, следует использовать файлы cookie или JWT.