8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

NRI OpenStandiaAdvent Calendar 2020

Day 18

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

Last updated at Posted at 2020-12-17

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

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

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

8
3
0

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
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?