LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

Organization

Keycloakにフィルタを登録してホゲホゲする

読んで嬉しいかもしれない人

Keycloakへのリクエストをフィルタで捕まえてホゲホゲしたい人向けです

概要

KeycloakにContainerRequestFilterを登録する方法を書いています
KeycloakのJAX-RS全リソースに対して、アクセスされる前に処理を入れることが可能になります

この記事を利用して出来そうなこと

ユーザを大量に作成するIPアドレスからのリクエストを全拒否する、とか

実装方法

  1. ホゲホゲしたい処理を行うContainerRequestFilterクラスを実装したFilterクラスを作成します
  2. フィルタを登録するためのAuthenticatorFactoryクラスを実装したFactoryクラスを作成します

コード

Filterクラス
@Provider
public class Filter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext context) throws IOException {
        // やりたい処理
    }
}
Factoryクラス
public class FilterFactory implements AuthenticatorFactory {

    @Override
    public String getDisplayType() {
        return null;
    }

    @Override
    public String getReferenceCategory() {
        return null;
    }

    @Override
    public boolean isConfigurable() {
        return false;
    }

    @Override
    public AuthenticationExecutionModel.Requirement[] getRequirementChoices() {
        return new AuthenticationExecutionModel.Requirement[0];
    }

    @Override
    public boolean isUserSetupAllowed() {
        return false;
    }

    @Override
    public String getHelpText() {
        return null;
    }

    @Override
    public List<ProviderConfigProperty> getConfigProperties() {
        return null;
    }

    @Override
    public Authenticator create(KeycloakSession session) {
        return null;
    }

    @Override
    public void init(Config.Scope config) {
    }

    // 起動時のイベント(PostMigrationEvent)をリッスンしてApplicationクラスにフィルタを追加
    @Override
    public void postInit(KeycloakSessionFactory factory) {
        factory.register(new ProviderEventListener() {
            public void onEvent(ProviderEvent pe) {
                if (pe instanceof PostMigrationEvent) {
                    KeycloakApplication ka = ResteasyProviderFactory.getContextData(KeycloakApplication.class);
                    ka.getClasses().add(Filter.class);
                }
            }
        });
    }

    @Override
    public void close() {

    }

    @Override
    public String getId() {
        return "dummy";
    }
}

登録方法

  1. META-INF配下に作成したFactoryクラス名を記載した定義ファイルを作成してください
  2. ビルドしてデプロイしてKeycloakを再起動してください

終わりに

JAX-RSのリソース名なり、リクエストPathなりで絞って、各リソースへのアクセス前に処理を入れることが出来たりします
リスクベース認証用のAuthenticatorを作って、リスク情報でアクセス制御とかも出来そうですな

Keycloakでリスクベース認証をやってみた記事はこちら
https://qiita.com/naokiiiii/items/c5bc7ed2204507f4ad6a#15-%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4

~~後日、サンプル実装公開予定~~

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2