Keycloak:在多个身份提供商中检查密码

时间:2018-01-23 10:38:18

标签: java authentication keycloak keycloak-services

我正在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,因此我需要更改执行,以便它不会因为在一个Provider中找到的用户的“无效凭据”而停止。

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

所以我把它深入到AbstractUsernameFormAuthenticator.java中的方法validatePassword(...) - > https://github.com/keycloak/keycloak/blob/master/services/src/main/java/org/keycloak/authentication/authenticators/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 {
           ...
        }

或许有人可以给我一个如何实现这一目标的提示吗?我还没有找到一种方法来获取所有提供商。

非常感谢!

0 个答案:

没有答案