2017-06-21 2 views
0

Je veux mettre à jour les détails de l'utilisateur. par exemple. J'ai créé l'utilisateur (k1) dans le domaine "demo" de la console d'administration keycloak. J'ai un client java et je veux mettre à jour les détails de l'utilisateur (k1) comme. Changer l'adresse e-mail de l'utilisateur k1. J'ai utilisé le client Admin (Rest API) comme ci-dessous.Comment est-ce que je peux mettre à jour les détails d'utilisateur de keycloak programitically (java), sans employer le repos api d'administrateur?

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(); 
    } 
} 

Mais je veux faire la même chose sans utiliser le client Admin.

+0

Comment le ferait sans que le client reste? Ce n'est pas possible, ou vous utilisez la console ou les points de terminaison REST ... –

+0

J'utilisais le compte d'administrateur pour mettre à jour l'email.i.e de l'utilisateur. client d'administration keycloak. et j'avais besoin d'un autre moyen. – kunal

Répondre

0

Je l'ai fait en utilisant l'approche suivante.

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()); 
    } 
} 

Pour obtenir cette chose au-dessus fait que je dois changer mon account.ftl (qui est présent à l'emplacement *: * \ keycloak-demo-3.1.0.Final \ keycloak \ thèmes \ base \ compte \ account.ftl) comme suit

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

La raison du changement a été, je recevais erreur comme:

Impossible de traiter modèle: org.keycloak.theme.FreeMarkerException: Impossible de traiter modèle account.ftl

0

vous pouvez utiliser jsoup-1.6.0.jar pour mettre à jour les détails de tout utilisateur comme suit.

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"); 

}