有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java密钥斗篷:在多个身份提供程序中检查密码

我正在kc 3.4.3的“普通”用户名/密码表单上实现一个身份验证SPI执行。决赛-&燃气轮机https://github.com/keycloak/keycloak/blob/master/services/src/main/java/org/keycloak/authentication/authenticators/browser/UsernamePasswordForm.java

遗憾的是,用户名不是唯一的atm,所以我需要更改执行,这样它就不会因为在一个提供者中找到的用户的“无效凭据”而停止

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

所以我深入研究了validatePassword方法(…)在AbstractUsernameFormAuthenticator中。java->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) 个答案