Я пытаюсь реализовать настраиваемый SPI аутентификатора keycloack для аутентификации по внешнему источнику данных. Также доступна служба Spring boot Rest, я тоже могу ее использовать.
Пример использования, который я пытаюсь решить,
Пользователю предоставляется экран входа в Keycloak. Пользователь с отправкой проверяется по внешнему источнику данных.
Получите некоторые атрибуты из внешнего источника данных, сопоставьте их с идентификатором keycloak и токеном доступа.
Также поставьте условие ограничения пользователей на одновременный вход одного и того же пользователя в систему несколько раз.
Я думал, что это можно решить, получив информацию о сеансе пользователя, доступную в источнике данных keycloak. Если я использую внешний источник данных, сохраняет ли keycloak информацию о сеансе?
Я следил за разделом 8.3 официального руководства (https://www.keycloak.org/docs/latest/server_development/index.html#_auth_spi_walkthrough), что очень похоже на то, что мне нужно.
Теперь я пропустил и начал согласно разделу 11 (https://www.keycloak.org/docs/latest/server_development/index.html#_user-storage-spi) также кажется более подходящим.
То, что я сделал, началось с реализации пользовательского аутентификатора SPI, который решил, что это неправильный путь, и теперь реализовал UserStorageProvider.
/***
* From UserLookupProvider
*/
public UserModel getUserById(String id, RealmModel realm) {
System.out.println("ID: " + id + ":REALM:" + realm);
StorageId storageId = new StorageId(id);
/**
* StorageId.getExternalId() method is invoked to obtain
* the username embeded in the id parameter
*/
String username = storageId.getExternalId();
System.out.println("Name:" + username);
return getUserByUsername(username, realm);
}
/***
* From UserLookupProvider
* This method is invoked by the Keycloak login page when a user logs in
*/
public UserModel getUserByUsername(String username, RealmModel realm) {
System.out.println("USERNAME: " + username + ":REALM:" + realm);
UserModel userModel = loadedUsers.get(username);
if (userModel == null) {
String password = properties.getProperty(username);
if (password != null) {
userModel = createUserModel(realm, username);
System.out.println("New UserModel:");
System.out.println(userModel.toString());
loadedUsers.put(username, userModel);
}
}
return userModel;
}
protected UserModel createUserModel(RealmModel realm, String username) {
return new AbstractUserAdapter(session, realm, model) {
@Override
public String getUsername() {
return username;
}
};
}
Следуйте документу (https://www.keycloak.org/docs/latest/server_development/index.html#packaging-and-deployment-2)
Файлы классов для нашей реализации провайдера должны быть помещены в jar. Вы также должны объявить фабричный класс провайдера в файле META-INF / services / org.keycloak.storage.UserStorageProviderFactory.
Вопрос вот в чем: jar, который я создал, не имеет каталога служб внутри папки "META-INF", нужно ли мне создавать и добавлять его вручную?
org.keycloak.examples.federation.properties.FilePropertiesStorageFactory Создав банку, вы можете развернуть ее, используя обычные средства WildFly: скопируйте банку в каталог deploy / или с помощью интерфейса командной строки JBoss.
После создания jar-файла с помощью maven скопируйте jar-файл в папку «keycloak-6.0.1 \ standalone \ deployments». но я не вижу своего провайдера в «списке Федерации пользователей»
Любое предложение / помощь будет принята с благодарностью!
Заранее благодарим за ваши предложения.