3

jboss keycloak 1.5 最終バージョンを使用しています。キークローク プロパティとユーザー エンタープライズ データベースとのインターフェイスとなるカスタム ユーザー フェデレーション プロバイダーを開発しました。

レガシー ユーザー データベースに関連する特定のエラーに基づいて、ログイン インターフェイスのカスタム エラー メッセージをユーザーに送信する必要があります。

キークロークのテーマには、ローカライズして新しいメッセージを追加できるリソースフォルダーがあることがわかりました。次に、Angular jsを使用してそれらを参照できます

$myMessage

表記。問題は、キークロークサーバーからメッセージを上げたいことです。私のユーザー フェデレーション プロバイダーは UserFederationProvider インターフェイスを実装しています。だから私はオーバーライドする必要があります:

@Override
public CredentialValidationOutput validCredentials(RealmModel realm, UserCredentialModel credential) {
    LOGGER.info("validCredentials(realm, credential)");
    return CredentialValidationOutput.failed();
}

これは、CredentialValidationOutput に検証出力として送信されるカスタム メッセージが含まれているという理由だけで、私が探していた方法のようです。問題は、このメソッドが呼び出されないことです。

なんで?

4

1 に答える 1

3

自分で見つけた答えを投稿します。

独自の Authenticator を開発する必要があります。たとえば、Keycloak UsernameAndForm および UsernameAndFormFactory の実装を参照してください。

それらは、Keycloak github ソース コードで見つけることができます。

https://github.com/keycloak/keycloak/tree/master/services/src/main/java/org/keycloak/authentication/authenticators/browser

主な検証方法は次のとおりです。

public boolean validateUserAndPassword(AuthenticationFlowContext context, MultivaluedMap<String, String> inputData) {

    ...

}

 public boolean validatePassword(AuthenticationFlowContext context, UserModel user, MultivaluedMap<String, String> inputData) {

    ...

}

カスタム ユーザー フェデレーション プロバイダーからカスタム例外をスローし、上記の 2 つのメソッドでそれらをキャッチして、以下を追加できます。

catch (YourCustomException ex){
    ...
    Response challengeResponse = context.form()
                .setError("YOUR ERROR MESSAGE", me.getMandator()).createLogin();        
    context.failureChallenge(AuthenticationFlowError.INVALID_USER, challengeResponse);
        return false;
}

もちろん、プロジェクトに追加する必要があります

META-INF/service/org.keycloak.authentication.AuthenticatorFactory

AuthenticatorFactory の完全修飾名を指定します。

有効なガイドについては、Keycloak User Guide 1.6.1 Finalを参照してください。33.3章

于 2015-11-30T21:43:16.053 に答える