我如何更新keydave';在不使用rest管理api的情况下,以编程方式(java)保存用户详细信息?

我如何更新keydave';在不使用rest管理api的情况下,以编程方式(java)保存用户详细信息?,java,rest,keycloak,Java,Rest,Keycloak,我想更新用户详细信息。e、 我从keydove管理控制台在“demo”域中创建了用户(k1)。我有一个java客户端,我想更新用户(k1)的详细信息,比如。更改用户k1的电子邮件地址 我使用管理客户端(RESTAPI)完成了如下操作 public void updateEmail(final String newEmailAddress) { try { final AccessToken accessToken = getToken(); Keycloa

我想更新用户详细信息。e、 我从keydove管理控制台在“demo”域中创建了用户(k1)。我有一个java客户端,我想更新用户(k1)的详细信息,比如。更改用户k1的电子邮件地址

我使用管理客户端(RESTAPI)完成了如下操作

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

但是我希望在不使用管理客户端的情况下也能做到这一点。

我使用了以下方法

    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", "5somebody@gmail.com"));
    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());
    }
}
public void updateEmail(最终字符串newEmailAddress)
抛出ClientProtocolException、IOException、HttpFailure、VerificationException{
List formparams=new ArrayList();
formparams.add(新的BasicNameValuePair(“状态检查器”、“QW1iwts0YS8pC0JDosACq-2ZAJHtTW8HWN7KSgTV8rc”);
formparams.add(新的BasicNameValuePair(“电子邮件”)5somebody@gmail.com"));
formparams.add(新的BasicNameValuePair(“firstName”、“1some”);
formparams.add(新的BasicNameValuePair(“lastName”、“1body”);
keydeployment=this.getDeployment();
HttpPost=新的HttpPost(“http://localhost:8080/auth/realms/demo/account/");
setClientCredentialsProviderUtils.setClientCredentials(部署、发布、formparams);
post.setHeader(“接受”、“应用程序/json”);
setHeader(“Accept”,“text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8”);
post.setHeader(“授权”、“承载者”+this.getTokenString(10,TimeUnit.SECONDS));
UrlEncodedFormEntity表单=新的UrlEncodedFormEntity(formparams,“UTF-8”);
邮政实体(表格);
HttpResponse response=deployment.getClient().execute(post);
if(response.getStatusLine().getStatusCode()==200){
打印(response.getEntity().getContent());
}否则{
打印(response.getEntity().getContent());
System.out.println(response.getStatusLine().toString());
}
}
要完成上述操作,我需要更改我的account.ftl(位于位置*:*\keydove-demo-3.1.0.Final\keydove\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.keydape.theme.FreeMarkerException:无法处理模板帐户。ftl

您可以使用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");
public boolean updateAccountDetails(字符串名称、字符串值)
{
字符串url=GetKeyPoveAdapter().getDeployment().getAccountUrl();
Document Document=Jsoup.connect(url.get();
如果(文档!=null){
String formQuery=String.format(“form[action^=%s]”,url);
元素表单=单据。选择(表单查询);
如果(!form.isEmpty()){
元素输入=表单。选择(“输入[值],输入:非([禁用])”;
元素saveAction=form.select(“按钮[value=Save]”)。first();
输入。添加(保存操作);
Map mandatoryArguments=new HashMap();
用于(元素输入:输入){
mandatoryArguments.put(input.attr(“name”)、input.attr(“value”);
}
put(attributeName,newValue);
Response=Jsoup.connect(accountUrl)
.data(mandatoryArguments)
.method(method.POST)
.execute();
Document finalDoc=response.parse();
如果(finalDoc!=null){
Elements finalForm=finalDoc.select(formQuery);
if(finalForm!=null){
String newValueQuery=String.format(“输入[name=%s],输入[value=%s]、名称、值);
Elements finalInputs=finalForm.select(newValueQuery);
if(finalInputs!=null){
return!finalInputs.isEmpty();
}
}
}
}
}
抛出新IOException(“未找到帐户页”);

}

如果没有REST客户端,该如何操作?这是不可能的,或者您使用控制台或REST端点…我正在使用管理员帐户更新用户的电子邮件。密钥斗篷管理客户端。我需要另一种方式。您是否找到了更多关于允许用户在不使用管理员凭据的情况下使用访问令牌更新其信息的建议方式的信息?我一直在四处寻找,现在找不到它。