java - 实现自定义 Keycloak 身份 validator SPI 时遇到的问题

标签 java keycloak

我正在尝试实现一个自定义 keycloack Authenticator SPI,用于针对外部身份提供者进行身份验证。用户已经存在于 keycloak 存储中,我只需要连接到自定义 SPI 即可对他们进行身份验证。

我正在遵循官方指南 https://www.keycloak.org/docs/latest/server_development/index.html#_auth_spi_walkthrough 的第 8.3 节,这与我需要的非常相似。

我遇到的问题是,在身份验证流程运行到自定义身份 validator 的“action”方法之后,AuthenticationProcessor 类会抛出异常,经过检查后,来自以下检查:

 // org.keycloak.authentication.AuthenticationProcessor - line 876
    if (authenticationSession.getAuthenticatedUser() == null) {
         throw new AuthenticationFlowException(AuthenticationFlowError.UNKNOWN_USER);
    } 

看到这个问题后,我尝试解决它的想法是从 keycloak 存储中获取用户(已经针对外部身份提供者进行了验证),并将其推送到 AuthenticationSession 中,如下所示:

// Connect against external Service Provider
// and asume "USER_ID" represents an already validated User

// AuthenticationFlowContext = afc is given as parameter
UserFederationManager ufm = afc.getSession().users();   // <-- PROBLEM
UserModel userFound = ufm.getUserById("USER_ID", afc.getRealm());

if (userFound != null) {
    // get reference to the authSession
    AuthenticationSessionModel asm = afc.getAuthenticationSession();
    // set authenticated user on the session
    asm.setAuthenticatedUser(userFound );
    return true;
}
return false;

上述代码的问题在于,关于 org.keaycloak.models.KeycloackSession 类的 users() 方法抛出了 Java NoSuchMethodExceptionError。像这样:

11:26:32,628 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (default task-14) Uncaught server error: java.lang.NoSuchMethodError: org.keycloak.models.KeycloakSession.users()Lorg/keycloak/models/UserFederationManager;

如果您能提出任何建议来帮助我解决这个问题,我们将不胜感激!

最佳答案

问题似乎是我使用的是 org.keycloak.models.UserFederationManager 实例,而不是 org.keycloak.models.UserProvider 实例。 UserFederationManager 实现了 UserProvider,并且在该 keycloak 使用的注入(inject)机制下,似乎更通用的类型比更具体的类型效果更好

 // UserFederationManager ufm = afc.getSession().users();   // <-- PROBLEM
 // UserProvider ufm = afc.getSession().users();            // <-- WORKS

即使它现在可以工作,您的两个建议都是有效的,因为我的构建版本确实与运行时的版本不同,我将解决这个问题以避免进一步的错误。

感谢您的意见,伙计们!

关于java - 实现自定义 Keycloak 身份 validator SPI 时遇到的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56867627/

相关文章:

java - 如何从 mongoDB 检索值?

java - 让 Thymeleaf 读取对象模型数组

java - 编译 fatal error : java. lang.Il legalAccessError : class lombok. javac.apt.LombokProcessor

当角色数量达到数百时,Keycloak 重定向失败

java - Keycloak + Spring Security,通过本地登录表单

使用 chrome 扩展进行 Keycloak 登录

java - 如果我已经完成了 ORM,我还需要 Web 应用程序框架吗?

java - 自定义注释,用于从 HttpServletRequest 获取具有指定 @RequestHeaders 集的自定义对象

Keycloak:缺少领域公钥

keycloak 仅持有者客户端 : why do they exist?