Nano Hash - криптовалюты, майнинг, программирование

Как я могу обновить данные пользователя keycloak программно (java) без использования rest admin api?

Я хочу обновить сведения о пользователе. например Я создал пользователя (k1) в "демонстрационной" области из административной консоли keycloak. У меня есть один клиент Java, и я хочу обновить данные пользователя (k1), например. Изменить адрес электронной почты пользователя k1.

Я использовал клиент администратора (Rest API), как показано ниже.

public void updateEmail(final String newEmailAddress) {
    try {
        final AccessToken accessToken = getToken();
        Keycloak keycloak = KeycloakBuilder.builder().serverUrl(this.getDeployment().getAuthServerBaseUrl())
                .realm(this.getDeployment().getRealm()).username("k1").password("123").clientId(ADMIN_CLIENT)
                .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build()).build();

        UserResource userResource = keycloak.realm(this.getDeployment().getRealm()).users()
                .get(accessToken.getSubject());
        UserRepresentation user = userResource.toRepresentation();
        user.setEmail(newEmailAddress);
        userResource.update(user);

    } catch (Exception exception) {
        exception.printStackTrace();
    }
}

Но я хочу сделать то же самое без использования клиента администратора.

21.06.2017

  • Как бы это было без клиента REST? Это невозможно, или вы используете консоль или конечные точки REST ... 22.06.2017
  • Я использовал учетную запись администратора для обновления электронной почты пользователя. клиент администратора keycloak. и мне нужен был другой способ. 23.06.2017
  • Вы нашли дополнительную информацию о том, как рекомендуется разрешить пользователям обновлять свою информацию с помощью токена доступа без использования учетных данных администратора? Я искал вокруг и пока не нашел. 30.03.2020

Ответы:


1

вы можете использовать jsoup-1.6.0.jar для обновления любой информации о пользователе, как показано ниже.

public boolean updateAccountDetails(String name, String value) 
{
String url= getKeycloakAdapter().getDeployment().getAccountUrl();

Document document = Jsoup.connect(url).get();
if (document != null) {
  String formQuery = String.format("form[action^=%s]", url);
  Elements form = document.select(formQuery);
  if (!form.isEmpty()) {
    Elements inputs = form.select("input[value], input:not([disabled])");
    Element saveAction = form.select("button[value=Save]").first();
    inputs.add(saveAction);
    Map<String, String> mandatoryArguments = new HashMap<>();
    for (Element input : inputs) {
      mandatoryArguments.put(input.attr("name"), input.attr("value"));
    }
    mandatoryArguments.put(attributeName, newValue);
    Response response = Jsoup.connect(accountUrl)
        .data(mandatoryArguments)
        .method(Method.POST)
        .execute();

    Document finalDoc = response.parse();
    if (finalDoc != null) {
      Elements finalForm = finalDoc.select(formQuery);
      if (finalForm != null) {
        String newValueQuery = String.format("input[name=%s], input[value=%s]", name, value);
        Elements finalInputs = finalForm.select(newValueQuery);
        if (finalInputs != null) {
          return !finalInputs.isEmpty();
        }
      }
    }
  }
}
throw new IOException("Account page not found");

}

15.11.2017

2

Я сделал это, используя следующий подход.

    public void updateEmail(final String newEmailAddress)
        throws ClientProtocolException, IOException, HttpFailure, VerificationException {

    List<NameValuePair> formparams = new ArrayList<>();

    formparams.add(new BasicNameValuePair("stateChecker", "QW1iwts0YS8pC0JDosACq-2ZAJHtTW8HWN7KSgTV8rc"));
    formparams.add(new BasicNameValuePair("email", "[email protected]"));
    formparams.add(new BasicNameValuePair("firstName", "1some"));
    formparams.add(new BasicNameValuePair("lastName", "1body"));

    KeycloakDeployment deployment = this.getDeployment();

    HttpPost post = new HttpPost("http://localhost:8080/auth/realms/demo/account/");
    ClientCredentialsProviderUtils.setClientCredentials(deployment, post, formparams);
    post.setHeader("Accept", "application/json");
    post.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    post.setHeader("Authorization", "Bearer " + this.getTokenString(10, TimeUnit.SECONDS));

    UrlEncodedFormEntity form = new UrlEncodedFormEntity(formparams, "UTF-8");
    post.setEntity(form);

    HttpResponse response = deployment.getClient().execute(post);

    if (response.getStatusLine().getStatusCode() == 200) {
        print(response.getEntity().getContent());
    } else {
        print(response.getEntity().getContent());
        System.out.println(response.getStatusLine().toString());
    }
}

Чтобы сделать это, мне нужно изменить свой account.ftl (который находится в местоположении *: * \ keycloak-demo-3.1.0.Final \ keycloak \ themes \ base \ account \ account .ftl) следующим образом

    <#if stateChecker??>
        <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker?html}">
    <#else>
        <input type="hidden" id="stateChecker" name="stateChecker" value=" ">
    </#if>

Причина изменения заключалась в том, что я получал ошибку, например:

Не удалось обработать шаблон: org.keycloak.theme.FreeMarkerException: не удалось обработать шаблон account.ftl

23.06.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..