顧客ごとにデータベースを持つレガシー アプリケーションを書き直しています。各顧客には、独自の認証とユーザー セットがあります。したがって、django の認証はデフォルトのみを使用するように設定されているため、カスタム認証バックエンドが必要になります。リクエストごとに URL を調べ、そこにある情報を抽出してリクエストに database_name を設定するミドルウェアを作成しました。
カスタム認証バックエンドの処理中にリクエストにアクセスできた場合、データベース呼び出しを簡単に実行できますが、user = User.objects.using(request.db).get(username=username)
これを実現する簡単な方法はありません。私はここでそれに対する答えを見てきました: backend.get_user から request.session にアクセスしますが、これはスレッドセーフではないように見えるので、その道をたどりたくありません。
まだdjango-authを使用していると私が見ることができる唯一の解決策は、データベース名をクラス属性として使用するように設定する各顧客の認証バックエンドを持つことです。次に、request.session['_auth_user_backend'] を顧客固有のバックエンドに設定するカスタム ログイン関数を作成します。したがって、各リクエストで get_user(user_id) が呼び出されると、リクエスト元のデータベースを認識している顧客のバックエンドが使用されます。
可能であれば、顧客ごとに認証バックエンドを管理する必要は避けたいと考えています。これを行うより良い方法はありますか?