概要
実際のアプリケーションでdjango-allauthを使用する際には、User保存処理をカスタマイズしたくなると思うので、その方法を調べていく。
以下の記事の流れでKeycloakを使ったOIDC認証を前提とする。
準備
Djangoの公式ドキュメントに従って、AbstractUserを継承してカスタムユーザーを定義する。
今回は検証用にjobというフィールドを追加してみる。
models.py
from django.contrib.auth.models import AbstractUser from django.db import models class AppUser(AbstractUser): job = models.CharField(max_length=100, blank=True)
settings.pyにAUTH_USER_MODELを定義する。
settings.py
# 省略 AUTH_USER_MODEL = "app.AppUser"
Django AdminにAppUserを登録して登録したデータを確認できるようにする。
admin.py
from django.contrib import admin from .models import AppUser admin.site.register(AppUser)
Adapterのオーバーライド
django-allauthでUserの保存処理をカスタマイズする際にはAdapterというクラスをオーバーライドするらしい。
The adapter class allows you to override various functionality of the allauth.account app. To do so, point settings.ACCOUNT_ADAPTER to your own class that derives from DefaultAccountAdapter and override the behavior by altering the implementation of the methods according to your own needs.
Keycloakではsocialaccountを使用しているので、以下のようにsettings.pyの定数名と継承するAdapterクラスが変わる。
settings.ACCOUNT_ADAPTER→settings.SOCIALACCOUNT_ADAPTERallauth.account.adapter.DefaultAccountAdapter→allauth.socialaccount.adapter.DefaultSocialAccountAdapter
https://docs.allauth.org/en/dev/socialaccount/configuration.html
カスタムAdapterの実装
以下のようにDefaultSocialAccountAdapterを継承したカスタムAdapterを実装する。
- Userモデルにフィールドを詰める処理は
populate_userというメソッドでやっているので、これをオーバーライドすればよさそう - 親クラスの
populate_userを実行した上で、カスタムAdapter側でフィールドを追加する。- まずは固定値で
jobに「プログラマ」という文字列を保存してみる
- まずは固定値で
DefaultSocialAccountAdapterをみると、Userインスタンスへのフィールド追加にはallauth.account.utils.user_fieldというユーティリティ関数を使っているので、寄せて実装する。
adapter.py
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter from allauth.account.utils import user_field class MySocialAccountAdapter(DefaultSocialAccountAdapter): def populate_user(self, request, sociallogin, data): user = super().populate_user(request, sociallogin, data) user_field(user, "job", "プログラマ") return user
settings.pyで使用するAdapterを定義する。
settings.py
# 省略 SOCIALACCOUNT_ADAPTER = "app.adapter.MySocialAccountAdapter" # 省略
動作確認
前回 と同じように、KeycloakでOIDC認証する。
→ Jobに「プログラマ」と保存されていることが確認できた。

今回はまずは固定文字列を保存してみたが、次はKeycloak側のユーザー属性にも追加してそれを動的に保存できるか検証してみたい。