Keycloak Попытка создать пользователя на основе информации из сертификата x509: AuthenticationFlowException Не найден сеJAVA

Программисты JAVA общаются здесь
Anonymous
Keycloak Попытка создать пользователя на основе информации из сертификата x509: AuthenticationFlowException Не найден се

Сообщение Anonymous »

Я пытаюсь реализовать интерфейс Authenticator, чтобы пользователь с картой сертификата x509 мог создать пользователя в Keycloak, а затем просто разрешить пользователю войти в систему, поскольку мы доверяем имени пользователя и другой информации, указанной в сертификате. .
Мы настраиваемся в Keycloak следующим образом:
[img]https://i .sstatic.net/8UZV5.png[/img]

Изображение

Для сбора этой информации из сертификата мы используем следующее (что, кстати, хорошо работает, когда мы его используем для получения информации о сертификате для формы, если мы используем обычную регистрацию):
p>

Код: Выделить всё

package com.mycompany.pki.pkihelper;

...

import org.jboss.resteasy.spi.HttpRequest;
...
import org.jboss.logging.Logger;

public class CertHelper {
private static final Logger logger = Logger.getLogger(CertHelper.class);

private static String removeBeginEndPem(String pem) {
pem = pem.replace("-----BEGIN CERTIFICATE-----", "");
pem = pem.replace("-----END CERTIFICATE-----", "");
pem = pem.replace("\r\n", "");
pem = pem.replace("\n", "");
return pem.trim();
}

...

public static String getCertificateUserName(HttpRequest httpRequest) {

String firstName = getCertificateFirstName(httpRequest);
String lastName = getCertificateLastName(httpRequest);
String userName = firstName+ "." + lastName;

if(firstName == ""){
return "";
}else{
return userName;
}

}

...

}
и затем мы используем этот класс аутентификатора:

Код: Выделить всё

package com.mycomponay.authentication;

import org.keycloak.authentication.AuthenticationFlowContext;
import org.keycloak.authentication.Authenticator;
import org.keycloak.authentication.authenticators.browser.UsernamePasswordForm;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserProvider;
import com.mycompoany.pki.pkihelper.CertHelper;

public class InternalAuthenticator implements Authenticator {

@Override
public void authenticate(AuthenticationFlowContext context) {
String username = context.getHttpRequest().getDecodedFormParameters().getFirst(UsernamePasswordForm.ATTEMPTED_USERNAME);
RealmModel realm = context.getRealm();

UserProvider userProvider = context.getSession().userStorageManager();
UserModel userModel = userProvider.getUserByUsername(username, realm);

if (userModel == null) {
// If the user doesn't exist, create a new user
username = CertHelper.getCertificateUserName(context.getHttpRequest());
userModel = createUser(context, realm, username);
userModel.setFirstName(CertHelper.getCertificateFirstName(context.getHttpRequest()));
userModel.setLastName(CertHelper.getCertificateLastName(context.getHttpRequest()));
userModel.setEmail("testuser@mycompany.com");
userModel.setEnabled(true);
}

context.setUser(userModel);
context.success();
}

private UserModel createUser(AuthenticationFlowContext context, RealmModel realm, String username) {
KeycloakSession session = context.getSession();
UserProvider userProvider = session.userStorageManager();

UserModel newUser = userProvider.addUser(realm, username);
newUser.setSingleAttribute("username", username);
session.getTransactionManager().commit();

return newUser;
}

@Override
...  // other overridden methods

}

Когда мы это делаем, мы получаем сообщение об ошибке:

Код: Выделить всё

20:48:32,938 WARN  [org.keycloak.services] (default task-3) KC-SERVICES0013: Failed authentication: org.keycloak.authentication.AuthenticationFlowException: Not found serialized context in clientSession
at org.keycloak.keycloak-services@19.0.3//org.keycloak.authentication.authenticators.broker.AbstractIdpAuthenticator.authenticate(AbstractIdpAuthenticator.java:68)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.authentication.DefaultAuthenticationFlow.processSingleFlowExecutionModel(DefaultAuthenticationFlow.java:446)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.authentication.DefaultAuthenticationFlow.processFlow(DefaultAuthenticationFlow.java:250)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.authentication.AuthenticationProcessor.authenticateOnly(AuthenticationProcessor.java:1017)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.authentication.AuthenticationProcessor.authenticate(AuthenticationProcessor.java:879)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.protocol.AuthorizationEndpointBase.handleBrowserAuthenticationRequest(AuthorizationEndpointBase.java:151)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.buildAuthorizationCodeAuthorizationResponse(AuthorizationEndpoint.java:338)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.process(AuthorizationEndpoint.java:194)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.buildGet(AuthorizationEndpoint.java:112)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Я думаю, мой вопрос заключается в том, как мы можем получить правильный сеанс, чтобы мы могли использовать наш класс CertHelper из интерфейса Authenticator?

Подробнее здесь: https://stackoverflow.com/questions/767 ... ficate-aut

Вернуться в «JAVA»