読んで嬉しいかもしれない人
Keycloakへのリクエストをフィルタで捕まえてホゲホゲしたい人向けです
概要
KeycloakにContainerRequestFilterを登録する方法を書いています
KeycloakのJAX-RS全リソースに対して、アクセスされる前に処理を入れることが可能になります
この記事を利用して出来そうなこと
ユーザを大量に作成するIPアドレスからのリクエストを全拒否する、とか
実装方法
- ホゲホゲしたい処理を行う
ContainerRequestFilter
クラスを実装したFilterクラスを作成します - フィルタを登録するための
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";
}
}
#登録方法
- META-INF配下に作成したFactoryクラス名を記載した定義ファイルを作成してください
- ビルドしてデプロイして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
~~後日、サンプル実装公開予定~~