2

我在 kc 3.4.3.Final 的“普通”用户名/密码形式之上实现了身份验证 SPI 执行。-> https://github.com/keycloak/keycloak/blob/master/services/src/main/java/org/keycloak/authentication/authenticators/browser/UsernamePasswordForm.java

可悲的是,用户名不是唯一的 atm,所以我需要更改执行,以便它不会因在一个提供者中找到的用户而停止“无效凭据”。

我不想给出“无效凭据”错误,而是希望我的执行首先检查所有其他提供者是否有相同的用户名,然后根据所有匹配项检查凭据。并且只是在没有凭据匹配的情况下,它应该失败,或者当在我的任何(3)个提供者中找到一个时为该用户登录一个新会话,这些提供者是由用户联合功能添加的(2 个 AD,一个由自定义用户存储 SPI)。

所以我将它深入到 AbstractUsernameFormAuthenticator.java 中的方法 validatePassword(...) -> https://github.com/keycloak/keycloak/blob/master/services/src/main/java/org/keycloak/authentication/ authenticationators/browser/AbstractUsernameFormAuthenticator.java第 191 行,我想相应地更改。可悲的是,我找不到一种方法来获取领域的所有提供者并进行相应的检查。我要更改的代码是:

if (password != null && !password.isEmpty() && context.getSession().userCredentialManager().isValid(context.getRealm(), user, credentials)) {
            return true;
        } else {...}

我想检查所有提供者,而不是只检查一个提供者的 isValid(),这就是 atm 的作用。像这个伪代码:

if (password != null && !password.isEmpty() && context.getSession().userCredentialManager().isValid(context.getRealm(), user, credentials)) {
        boolean isValid = false;
        List<Provider> realmProviders = context.getAllProviders();
        for(Provider provider : realmProviders){
            isValid = provider.isValid(...);
        }
            return isValid;
        } else {
           ...
        }

谁能给我一个提示如何实现这一目标?我还没有找到获得所有提供者的方法。

非常感谢!

4

0 回答 0