{"title":"Django の認証方法のカスタマイズ","version":"6.0","locale":"ja","docname":"topics/auth/customizing","url":"/ja/6.0/topics/auth/customizing/","canonical":"https://djangodocs.dev/ja/6.0/topics/auth/customizing/","summary":"Django がデフォルトで提供する認証機能は、ほとんどの一般的なケースでは十分なものですが、デフォルトではニーズにマッチしない場合もあると思います。","html":"<h1>Django の認証方法のカスタマイズ<a class=\"heading-anchor\" href=\"#customizing-authentication-in-django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django がデフォルトで提供する認証機能は、ほとんどの一般的なケースでは十分なものですが、デフォルトではニーズにマッチしない場合もあると思います。自分のプロジェクトで認証のカスタマイズを行うためには、Django が提供する認証システムをどの場所で拡張・置換できるかという知識が必要です。このドキュメントでは、認証システムをカスタマイズする方法の詳細について説明します。</p>\n<p><a class=\"reference internal\" href=\"#authentication-backends\"><span class=\"std std-ref\">認証バックエンド</span></a> を利用すると、ユーザーモデルに保存されたユーザー名とパスワードを用いて異なるサービス間での認証を行う必要が生じた場合に Django 標準よりも高い拡張性を持たせることができます。</p>\n<p>モデルには、Django の認可システムで検証可能な <a class=\"reference internal\" href=\"#custom-permissions\"><span class=\"std std-ref\">カスタムパーミッション</span></a> を組み込むことができます。</p>\n<p>デフォルトの <code class=\"docutils literal notranslate\">User</code> モデルを <a class=\"reference internal\" href=\"#extending-user\"><span class=\"std std-ref\">拡張</span></a> したり、完全にカスタマイズしたモデルと <a class=\"reference internal\" href=\"#auth-custom-user\"><span class=\"std std-ref\">置換</span></a> したりできます。</p>\n<section id=\"other-authentication-sources\">\n<span id=\"authentication-backends\"></span><h2>他の認証ソースを利用する<a class=\"heading-anchor\" href=\"#other-authentication-sources\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>別の認証ソース、つまり、ユーザー名とパスワード、または他の認証方法を持つ別のソースにフックする必要がある場合があるかも知れません。</p>\n<p>たとえば、あなたの会社ですでに全ての従業員のユーザ名とパスワードを記録しているLDAP認証があるとしましょう。もしユーザがLDAP認証とDjangoアプリケーションで異なるアカウントだとしたらネットワーク管理者とユーザで口論になるでしょう。</p>\n<p>そこでこのような状況に対応するためにDjangoの認証システムは他の認証システムのリソースと接続できます。あなたはDjangoのデフォルトのデータベーススキーマをオーバーライドするか、他のシステムを連携するためにデフォルトシステムを使うことができます。</p>\n<p>Django に含まれている認証バックエンドに関する情報は <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#authentication-backends-reference\"><span class=\"std std-ref\">認証バックエンドリファレンス</span></a> を参照してください。</p>\n<section id=\"specifying-authentication-backends\">\n<h3>認証バックエンドを指定する<a class=\"heading-anchor\" href=\"#specifying-authentication-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Behind the scenes, Django maintains a list of &quot;authentication backends&quot; that it\nchecks for authentication. When somebody calls\n<a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#django.contrib.auth.authenticate\" title=\"django.contrib.auth.authenticate\"><code class=\"xref py py-func docutils literal notranslate\">django.contrib.auth.authenticate()</code></a> -- as described in <a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#how-to-log-a-user-in\"><span class=\"std std-ref\">How to log\na user in</span></a> -- Django tries authenticating across\nall of its authentication backends. If the first authentication method fails,\nDjango tries the second one, and so on, until all backends have been attempted.</p>\n<p>認証バックエンドとして利用するリストは <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\">AUTHENTICATION_BACKENDS</code></a> に定義されています。この設定値は認証方法を定義している Python クラスを指定する Python パスのリスト型変数でなければなりません。これらのクラスはあなたの環境で有効な Python パスのどこにでも配置可能です。</p>\n<p>初期状態では、<a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\">AUTHENTICATION_BACKENDS</code></a> は以下の値として定義されています。:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span><span class=\"s2\">&quot;django.contrib.auth.backends.ModelBackend&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>これは Django のユーザーデータベースを確認してビルトインの権限を照会する基本的な認証バックエンドです。このバックエンドにはログイン試行を制限することでブルートフォース攻撃を防御する仕組みは提供していません。独自に試行制限を実装した認証バックエンドを利用するか、多くのウェブサーバーで提供されている各種防御機構が利用可能です。</p>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\">AUTHENTICATION_BACKENDS</code></a> への順番は処理に影響し、同じユーザー名とパスワードによって複数のバックエンドで有効な認証と判定されれば、Django は最初に有効と判定した時点で処理を終了します。</p>\n<p>ある認証バックエンドにおいて <a class=\"reference internal\" href=\"/ja/6.0/ref/exceptions/#django.core.exceptions.PermissionDenied\" title=\"django.core.exceptions.PermissionDenied\"><code class=\"xref py py-class docutils literal notranslate\">PermissionDenied</code></a> 例外が発生した場合、認証処理は直ちに終了し、Django は続く認証バックエンドに対する認証判定を行いません。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>一度ユーザーが認証されると、Django はユーザーの認証に使われたバックエンドの種類をユーザーのセッションに保存し、現在認証されているユーザーへのアクセスが必要なときはいつでも、そのセッションの間は同じバックエンドを再利用します。これは事実上、認証元がセッションごとにキャッシュされることを意味するため、<a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\">AUTHENTICATION_BACKENDS</code></a> を変更したとき、ユーザーに別の方法を使用した再認証を強制する必要がある場合、セッションデータを消去する必要があります。そのための簡単な方法は、<code class=\"docutils literal notranslate\">Session.objects.all().delete()</code> の実行です。</p>\n</aside>\n</section>\n<section id=\"writing-an-authentication-backend\">\n<h3>認証バックエンドの実装<a class=\"heading-anchor\" href=\"#writing-an-authentication-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>認証 (authentication) バックエンドは、2つの必須メソッド: <code class=\"docutils literal notranslate\">get_user(user_id)</code> と <code class=\"docutils literal notranslate\">authenticate(request, **credentials)</code> を実装したクラスであり、パーミッションに関連した省略可能な <a class=\"reference internal\" href=\"#authorization-methods\"><span class=\"std std-ref\">認可 (authorization) メソッド</span></a> もあります。</p>\n<p><code class=\"docutils literal notranslate\">get_user</code> メソッドは <code class=\"docutils literal notranslate\">user_id</code> 引数を取ります。これはユーザーネーム、データベースID、またはその他何でもかまいませんが、ユーザーオブジェクトの主キーである必要があります。そして、ユーザーオブジェクトまたは <code class=\"docutils literal notranslate\">None</code> を返します。</p>\n<p><code class=\"docutils literal notranslate\">authenticate</code> メソッドは <code class=\"docutils literal notranslate\">request</code> 引数と credentials キーワード引数を取ります。殆どの場合、これは次のようになります。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.backends</span> <span class=\"kn\">import</span> BaseBackend\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyBackend</span><span class=\"p\">(</span>BaseBackend<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">authenticate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> username<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> password<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Check the username/password and return a user.</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>一方、次のように認証トークンでも表せます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.backends</span> <span class=\"kn\">import</span> BaseBackend\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyBackend</span><span class=\"p\">(</span>BaseBackend<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">authenticate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> token<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Check the token and return a user.</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>いずれの場合にせよ、 <code class=\"docutils literal notranslate\">authenticate()</code> は与えられた認証情報を確認し、それが有効であれば、認証情報とマッチしたユーザーオブジェクトを返すべきです。それが有効でなければ <code class=\"docutils literal notranslate\">None</code> を返すべきです。</p>\n<p><code class=\"docutils literal notranslate\">request</code> は <a class=\"reference internal\" href=\"/ja/6.0/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\">HttpRequest</code></a> で、  <a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#django.contrib.auth.authenticate\" title=\"django.contrib.auth.authenticate\"><code class=\"xref py py-func docutils literal notranslate\">authenticate()</code></a> が提供されていない場合は <code class=\"docutils literal notranslate\">None</code>  となる可能性があります (バックエンドでこれを通過するため)。</p>\n<p>Djangoの管理サイトはDjangoの <a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#user-objects\"><span class=\"std std-ref\">Userオブジェクト</span></a> と密接に連携しています。たとえば、ユーザーが管理サイトにアクセスするには、<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_staff\" title=\"django.contrib.auth.models.User.is_staff\"><code class=\"xref py py-attr docutils literal notranslate\">User.is_staff</code></a> および <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_active\" title=\"django.contrib.auth.models.User.is_active\"><code class=\"xref py py-attr docutils literal notranslate\">User.is_active</code></a> が <code class=\"docutils literal notranslate\">True</code> である必要があります（詳細は <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/admin/#django.contrib.admin.AdminSite.has_permission\" title=\"django.contrib.admin.AdminSite.has_permission\"><code class=\"xref py py-meth docutils literal notranslate\">AdminSite.has_permission()</code></a> を参照してください）。</p>\n<p>これを実現する最善の方法は、バックエンド（例：LDAPディレクトリ、外部SQLデータベースなど）に存在する各ユーザーに対してDjangoの <code class=\"docutils literal notranslate\">User</code> オブジェクトを作成することです。事前にスクリプトを書いて作成するか、ユーザーが初めてログインした際に <code class=\"docutils literal notranslate\">authenticate</code> メソッドで自動的に作成する方法もあります。</p>\n<p>以下は、<code class=\"docutils literal notranslate\">settings.py</code> ファイル内で定義されたユーザー名とパスワード変数を使って認証を行い、ユーザーが初めて認証した際にDjangoの <code class=\"docutils literal notranslate\">User</code> オブジェクトを作成するバックエンドの例です。この例では、作成されたDjango <code class=\"docutils literal notranslate\">User</code> オブジェクトはスーパーユーザーとして設定され、管理サイトへの完全なアクセス権を持ちます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.conf</span> <span class=\"kn\">import</span> settings\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.backends</span> <span class=\"kn\">import</span> BaseBackend\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.hashers</span> <span class=\"kn\">import</span> check_password\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> User\n\n\n<span class=\"k\">class</span> <span class=\"nc\">SettingsBackend</span><span class=\"p\">(</span>BaseBackend<span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.</span>\n\n<span class=\"sd\">    Use the login name and a hash of the password. For example:</span>\n\n<span class=\"sd\">    ADMIN_LOGIN = &#39;admin&#39;</span>\n<span class=\"sd\">    ADMIN_PASSWORD = &#39;pbkdf2_sha256$30000$Vo0VlMnkR4Bk$qEvtdyZRWTcOsCnI/oQ7fVOu1XAURIZYoOZ3iq8Dr4M=&#39;</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">authenticate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> username<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> password<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        login_valid <span class=\"o\">=</span> settings<span class=\"o\">.</span>ADMIN_LOGIN <span class=\"o\">==</span> username\n        pwd_valid <span class=\"o\">=</span> check_password<span class=\"p\">(</span>password<span class=\"p\">,</span> settings<span class=\"o\">.</span>ADMIN_PASSWORD<span class=\"p\">)</span>\n        <span class=\"k\">if</span> login_valid <span class=\"ow\">and</span> pwd_valid<span class=\"p\">:</span>\n            <span class=\"k\">try</span><span class=\"p\">:</span>\n                user <span class=\"o\">=</span> User<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>username<span class=\"o\">=</span>username<span class=\"p\">)</span>\n            <span class=\"k\">except</span> User<span class=\"o\">.</span>DoesNotExist<span class=\"p\">:</span>\n                <span class=\"c1\"># Create a new user. There&#39;s no need to set a password</span>\n                <span class=\"c1\"># because only the password from settings.py is checked.</span>\n                user <span class=\"o\">=</span> User<span class=\"p\">(</span>username<span class=\"o\">=</span>username<span class=\"p\">)</span>  <span class=\"c1\"># is_active defaults to True.</span>\n                user<span class=\"o\">.</span>is_staff <span class=\"o\">=</span> <span class=\"kc\">True</span>\n                user<span class=\"o\">.</span>is_superuser <span class=\"o\">=</span> <span class=\"kc\">True</span>\n                user<span class=\"o\">.</span>save<span class=\"p\">()</span>\n            <span class=\"k\">return</span> user\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_user</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> user_id<span class=\"p\">):</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> User<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span>user_id<span class=\"p\">)</span>\n        <span class=\"k\">except</span> User<span class=\"o\">.</span>DoesNotExist<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">None</span>\n</code></pre></div>\n</section>\n<section id=\"handling-authorization-in-custom-backends\">\n<span id=\"authorization-methods\"></span><h3>カスタムバックエンドによる認可の扱い<a class=\"heading-anchor\" href=\"#handling-authorization-in-custom-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>カスタム認証バックエンドはそれら独自のパーミッションを提供できます。</p>\n<p>The user model and its manager will delegate permission lookup functions\n(<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.get_user_permissions\" title=\"django.contrib.auth.models.User.get_user_permissions\"><code class=\"xref py py-meth docutils literal notranslate\">get_user_permissions()</code></a>,\n<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.get_group_permissions\" title=\"django.contrib.auth.models.User.get_group_permissions\"><code class=\"xref py py-meth docutils literal notranslate\">get_group_permissions()</code></a>,\n<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.get_all_permissions\" title=\"django.contrib.auth.models.User.get_all_permissions\"><code class=\"xref py py-meth docutils literal notranslate\">get_all_permissions()</code></a>,\n<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.has_perm\" title=\"django.contrib.auth.models.User.has_perm\"><code class=\"xref py py-meth docutils literal notranslate\">has_perm()</code></a>,\n<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.has_module_perms\" title=\"django.contrib.auth.models.User.has_module_perms\"><code class=\"xref py py-meth docutils literal notranslate\">has_module_perms()</code></a>, and\n<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.UserManager.with_perm\" title=\"django.contrib.auth.models.UserManager.with_perm\"><code class=\"xref py py-meth docutils literal notranslate\">with_perm()</code></a>) to any\nauthentication backend that implements these functions.</p>\n<p>これによりユーザーに与えられたパーミッションは全てのバックエンドが返すすべてのパーミッションの上位セットになります。つまり、Django はユーザーに、任意のバックエンドが付与するパーミッションを与えます。</p>\n<p>If a backend raises a <a class=\"reference internal\" href=\"/ja/6.0/ref/exceptions/#django.core.exceptions.PermissionDenied\" title=\"django.core.exceptions.PermissionDenied\"><code class=\"xref py py-class docutils literal notranslate\">PermissionDenied</code></a>\nexception in <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.has_perm\" title=\"django.contrib.auth.models.User.has_perm\"><code class=\"xref py py-meth docutils literal notranslate\">has_perm()</code></a> or\n<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.has_module_perms\" title=\"django.contrib.auth.models.User.has_module_perms\"><code class=\"xref py py-meth docutils literal notranslate\">has_module_perms()</code></a>, the authorization\nwill immediately fail and Django won't check the backends that follow.</p>\n<p>バックエンドは、魔法のような admin のパーミッションを次のように実装できます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.backends</span> <span class=\"kn\">import</span> BaseBackend\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MagicAdminBackend</span><span class=\"p\">(</span>BaseBackend<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">has_perm</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> user_obj<span class=\"p\">,</span> perm<span class=\"p\">,</span> obj<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> user_obj<span class=\"o\">.</span>username <span class=\"o\">==</span> settings<span class=\"o\">.</span>ADMIN_LOGIN\n</code></pre></div>\n<p>上記の例では、アクセスしたユーザーに全てのパーミッションを付与します。注意すべき点として、関数 <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.auth.models.User</code></a> から関連して得られた同じ引数は、バックエンド認証関数は、匿名のユーザーを表すものも含んでいるかもしれない、全てのユーザーオブジェクトを引数として取る点があります。</p>\n<p>認可の実装の完全なものは <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.0.x/django/contrib/auth/backends.py\">django/contrib/auth/backends.py</a> の <code class=\"docutils literal notranslate\">ModelBackend</code> クラスにあり、これはデフォルトのバックエンドであり、ほとんどの場合 <code class=\"docutils literal notranslate\">auth_permission</code> テーブルを照会します。</p>\n<section id=\"authorization-for-anonymous-users\">\n<span id=\"anonymous-auth\"></span><h4>匿名ユーザーに対する認可<a class=\"heading-anchor\" href=\"#authorization-for-anonymous-users\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>匿名ユーザーは認証されていないユーザー、すなわち、有効な認証の詳細を何も提供しないユーザーです。しかし、それは必ずしも匿名ユーザーが何かを行うことを認可されないことを意味するわけではありません。最も基本的な基準として、ほとんどのウェブサイトは匿名ユーザーにサイトの大部分を閲覧する権限を与え、その多くは匿名ユーザーにコメント投稿などを許可しています。</p>\n<p>Django の認証フレームワークには、匿名ユーザーのアクセス許可を格納する場所はありません。しかし、認証バックエンドに渡されたユーザーオブジェクトは <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.AnonymousUser\" title=\"django.contrib.auth.models.AnonymousUser\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.auth.models.AnonymousUser</code></a> オブジェクトとなることがあります。これにより、バックエンドは匿名ユーザー向けのカスタムの認可動作を指定できます。この仕組みで特に便利なのは、再利用可能なアプリの作者が、たとえば匿名アクセスの制御の設定をする必要がなくなり、認可に関するすべての質問を認証バックエンドに移譲できるようになるような場合です。</p>\n</section>\n<section id=\"authorization-for-inactive-users\">\n<span id=\"inactive-auth\"></span><h4>アクティブでないユーザーに対する認可<a class=\"heading-anchor\" href=\"#authorization-for-inactive-users\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_active\" title=\"django.contrib.auth.models.User.is_active\"><code class=\"xref py py-attr docutils literal notranslate\">is_active</code></a> フィールドが <code class=\"docutils literal notranslate\">False</code> となっているユーザーを、アクティブでないユーザーと呼びます。認証バックエンド <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.backends.ModelBackend\" title=\"django.contrib.auth.backends.ModelBackend\"><code class=\"xref py py-class docutils literal notranslate\">ModelBackend</code></a> と <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\">RemoteUserBackend</code></a> はこれらのユーザーの認証行為を禁止します。カスタムユーザーモデルが <a class=\"reference internal\" href=\"#django.contrib.auth.models.CustomUser.is_active\" title=\"django.contrib.auth.models.CustomUser.is_active\"><code class=\"xref py py-attr docutils literal notranslate\">is_active</code></a> を持っていない場合、すべてのユーザーの認証行為が許可されます。</p>\n<p>もし、アクティブでないユーザーの認証行為を許可したい場合は、<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.backends.AllowAllUsersModelBackend\" title=\"django.contrib.auth.backends.AllowAllUsersModelBackend\"><code class=\"xref py py-class docutils literal notranslate\">AllowAllUsersModelBackend</code></a> や <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.backends.AllowAllUsersRemoteUserBackend\" title=\"django.contrib.auth.backends.AllowAllUsersRemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\">AllowAllUsersRemoteUserBackend</code></a> を使用できます。</p>\n<p>パーミッションシステムが匿名ユーザーをサポートしている場合、匿名ユーザーがパーミッションを持つ操作であっても、アクティブでないユーザーにはそれができないということが起こりえます。</p>\n<p>バックエンドで独自のパーミッションメソッド持つときは、ユーザーの <code class=\"docutils literal notranslate\">is_active</code> 属性のテストを忘れずに行ってください。</p>\n</section>\n<section id=\"handling-object-permissions\">\n<h4>オブジェクトのパーミッションの取扱い<a class=\"heading-anchor\" href=\"#handling-object-permissions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Django のパーミッションフレームワークはオブジェクトパーミッション基盤を持っていますが、コアには実装されていません。これにより、オブジェクトパーミッションのチェックは常に <code class=\"docutils literal notranslate\">False</code> または空のリスト（実行されたチェックに応じていずれか）が返されます。認証バックエンドは、オブジェクトに関連した認可メソッドごとに <code class=\"docutils literal notranslate\">obj</code> および <code class=\"docutils literal notranslate\">user_obj</code> のキーワードパラメータを受け取り、必要に応じてオブジェクトレベルのパーミッションを返します。</p>\n</section>\n</section>\n</section>\n<section id=\"custom-permissions\">\n<span id=\"id1\"></span><h2>カスタムパーミッション<a class=\"heading-anchor\" href=\"#custom-permissions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>モデルオブジェクトに対してカスタムパーミッションを作成したい場合は <a class=\"reference internal\" href=\"/ja/6.0/topics/db/models/#meta-options\"><span class=\"std std-ref\">モデルの Meta 属性</span></a> <code class=\"docutils literal notranslate\">permissions</code> を使用してください。</p>\n<p>この例の <code class=\"docutils literal notranslate\">Task</code> モデルは、2つのカスタムパーミッションを作成します。すなわち、このアプリケーションにおいて、ユーザーが <code class=\"docutils literal notranslate\">Task</code> インスタンスに関係して、できることとできないことを規定します。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Task</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        permissions <span class=\"o\">=</span> <span class=\"p\">[</span>\n            <span class=\"p\">(</span><span class=\"s2\">&quot;change_task_status&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Can change the status of tasks&quot;</span><span class=\"p\">),</span>\n            <span class=\"p\">(</span><span class=\"s2\">&quot;close_task&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Can remove a task by setting its status as closed&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">]</span>\n</code></pre></div>\n<p>これは <a class=\"reference internal\" href=\"/ja/6.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">manage.py migrate</code></a> を実行したときに、追加のパーミッションを作成するだけです (パーミッションを作成する関数は <a class=\"reference internal\" href=\"/ja/6.0/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\">post_migrate</code></a> シグナルに接続されています)。あなたがコード内でやることは、ユーザがアプリケーションの提供する機能(タスクのステータスを変更したり、タスクを閉じたり)にアクセスしようとしたときに、これらのパーミッションの値をチェックすることです。上記の例の続きで、次のコードはユーザーがタスクを閉じることができるかどうかをチェックします:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>user<span class=\"o\">.</span>has_perm<span class=\"p\">(</span><span class=\"s2\">&quot;app.close_task&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"extending-the-existing-user-model\">\n<span id=\"extending-user\"></span><h2>既存の <code class=\"docutils literal notranslate\">User</code> モデルを拡張する<a class=\"heading-anchor\" href=\"#extending-the-existing-user-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>独自のモデルを使用することなく、デフォルトのモデル <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> を拡張する方法が2つあります。振る舞いのみを変更し、データベースに格納されている内容を変更する必要がない場合は <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> に基づいて <a class=\"reference internal\" href=\"/ja/6.0/topics/db/models/#proxy-models\"><span class=\"std std-ref\">プロキシモデル</span></a> を作成できます。これにより、デフォルトの並び順、カスタムマネージャ、カスタムモデルメソッドなど、プロキシモデルによって提供される機能を利用可能です。</p>\n<p><code class=\"docutils literal notranslate\">User</code> に関連した情報を格納したい場合は、 <a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> を追加する情報のフィールドを持ったモデルに使用します。この一対一モデルはサイトユーザーに関する、認証には関連しない情報を格納することがあるため、しばしばプロファイルモデルと呼ばれます。たとえば、次のような Employee モデルを作ります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> User\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Employee</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    user <span class=\"o\">=</span> models<span class=\"o\">.</span>OneToOneField<span class=\"p\">(</span>User<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    department <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>User モデルと Employee モデルの両方を持つ既存の Employee Fred Smith を想定すると、 Django の標準的なリレーション先モデルの規約を使って、関連情報にアクセスできます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>u <span class=\"o\">=</span> User<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>username<span class=\"o\">=</span><span class=\"s2\">&quot;fsmith&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>freds_department <span class=\"o\">=</span> u<span class=\"o\">.</span>employee<span class=\"o\">.</span>department\n</code></pre></div>\n<p>admin のユーザーページにプロファイルモデルのフィールドを追加する場合は、<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">InlineModelAdmin</code></a> (この例では、<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/admin/#django.contrib.admin.StackedInline\" title=\"django.contrib.admin.StackedInline\"><code class=\"xref py py-class docutils literal notranslate\">StackedInline</code></a> を使用しています) をあなたの <code class=\"docutils literal notranslate\">admin.py</code> に定義し、それを <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> クラスで追加した <code class=\"docutils literal notranslate\">UserAdmin</code> クラスに追加します。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.admin</span> <span class=\"kn\">import</span> UserAdmin <span class=\"k\">as</span> BaseUserAdmin\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> User\n\n<span class=\"kn\">from</span> <span class=\"nn\">my_user_profile_app.models</span> <span class=\"kn\">import</span> Employee\n\n\n<span class=\"c1\"># Define an inline admin descriptor for Employee model</span>\n<span class=\"c1\"># which acts a bit like a singleton</span>\n<span class=\"k\">class</span> <span class=\"nc\">EmployeeInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>StackedInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Employee\n    can_delete <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    verbose_name_plural <span class=\"o\">=</span> <span class=\"s2\">&quot;employee&quot;</span>\n\n\n<span class=\"c1\"># Define a new User admin</span>\n<span class=\"k\">class</span> <span class=\"nc\">UserAdmin</span><span class=\"p\">(</span>BaseUserAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>EmployeeInline<span class=\"p\">]</span>\n\n\n<span class=\"c1\"># Re-register UserAdmin</span>\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>unregister<span class=\"p\">(</span>User<span class=\"p\">)</span>\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>User<span class=\"p\">,</span> UserAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<p>これらのプロファイルモデルは、特別な方法で処理される Django モデルではありません。ユーザーモデルと一対一のリンクを持っているだけです。したがって、ユーザーが作成されたときに自動的に作成されることはありませんが、<a class=\"reference internal\" href=\"/ja/6.0/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-attr docutils literal notranslate\">django.db.models.signals.post_save</code></a> を使って、適切にリレーション先モデルを作成または更新できます。</p>\n<p>関連づけされたモデルを使用した場合、関連するデータを検索するための追加のクエリ実行や結合が行われます。あなたの必要性に応じて、関連づけされたフィールドをカスタムユーザーモデルにインクルードすることは適した選択肢となるでしょう。しかしながら、デフォルトのユーザーモデルとプロジェクトのアプリケーションに組み込み済みの連携は追加のデータベース負荷を正当化するでしょう。</p>\n</section>\n<section id=\"substituting-a-custom-user-model\">\n<span id=\"auth-custom-user\"></span><h2>カスタムの <code class=\"docutils literal notranslate\">User</code> モデルを置き換える<a class=\"heading-anchor\" href=\"#substituting-a-custom-user-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django にビルトインされている <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> モデルは、必ずしもプロジェクトが必要とする認証のモデルと合致するわけではありません。たとえば、サイトによってはユーザー名の代わりにメールアドレスを識別トークンとして使用する方が適した場合があります。</p>\n<p>Django では、カスタムモデルを参照するように  <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> の値を設定することにより、デフォルトのユーザーモデルをオーバーライドできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>AUTH_USER_MODEL <span class=\"o\">=</span> <span class=\"s2\">&quot;myapp.MyUser&quot;</span>\n</code></pre></div>\n<p>このドットで区切られたペアは、Django app の <a class=\"reference internal\" href=\"/ja/6.0/ref/applications/#django.apps.AppConfig.label\" title=\"django.apps.AppConfig.label\"><code class=\"xref py py-attr docutils literal notranslate\">label</code></a> (<a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> に含まれている必要があります) と、ユーザーモデルとして使用したい Django モデルの名前です。</p>\n<section id=\"using-a-custom-user-model-when-starting-a-project\">\n<h3>プロジェクトの開始時にカスタムのユーザーモデルを使用する<a class=\"heading-anchor\" href=\"#using-a-custom-user-model-when-starting-a-project\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>新しいプロジェクトを開始する場合、<a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractUser\" title=\"django.contrib.auth.models.AbstractUser\"><code class=\"xref py py-class docutils literal notranslate\">AbstractUser</code></a> をサブクラス化することで、デフォルトのユーザーモデルと同じように動作するカスタムユーザーモデルを設定できます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> AbstractUser\n\n\n<span class=\"k\">class</span> <span class=\"nc\">User</span><span class=\"p\">(</span>AbstractUser<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> に指定することを忘れないでください。任意のマイグレーションの作成、また、最初に実行する <code class=\"docutils literal notranslate\">manage.py migrate</code> の前に行ってください。</p>\n<p>そして、モデルをアプリの <code class=\"docutils literal notranslate\">admin.py</code> に登録してください:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.admin</span> <span class=\"kn\">import</span> UserAdmin\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> User\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>User<span class=\"p\">,</span> UserAdmin<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"changing-to-a-custom-user-model-mid-project\">\n<h3>プロジェクト途中からのカスタムユーザーモデルへの変更<a class=\"heading-anchor\" href=\"#changing-to-a-custom-user-model-mid-project\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> をデータベーステーブルを作成した後に変更することも可能ですが、外部キーや多対多の関係などに影響を与えることがあるため、変更作業は複雑になるかもしれません。</p>\n<p>この変更は自動的には行うことができません。手動でのスキーマ修正、古いユーザーテーブルからのデータ移動、一部のマイグレーションの手動による再適用をする必要があります。ステップの概要は <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/25313\">#25313</a> を参照してください。</p>\n<p>スワップ可能なモデルという Django の動的依存性により、 <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> によって参照されるモデルはアプリの初回のマイグレーションで作成されなければなりません（通常は <code class=\"docutils literal notranslate\">0001_initial</code> と呼ばれます）。そうしない場合、依存関係の問題が発生します。</p>\n<p>マイグレーション中に <code class=\"docutils literal notranslate\">CircularDependencyError</code> に遭遇するかもしれません。依存関係の動的な性質のため、Django は依存関係のループを自動的に断ち切ることができないためです。もしこのエラーを見た場合、ユーザーモデルが依存しているモデルを2回目のマイグレーションに移動することで、依存関係のループがなくなるようにしてください。(お互いに <code class=\"docutils literal notranslate\">ForeignKey</code> を持つ2つの通常のモデルを作ることで、<code class=\"docutils literal notranslate\">makemigrations</code> が循環依存関係を通常と同じように解決させることもできます。)</p>\n</section>\n<section id=\"reusable-apps-and-auth-user-model\">\n<h3>再利用可能なアプリと <code class=\"docutils literal notranslate\">AUTH_USER_MODEL</code><a class=\"heading-anchor\" href=\"#reusable-apps-and-auth-user-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>再利用可能アプリはカスタムのユーザーモデルを実装するべきではありません。多数のアプリを使用するプロジェクトの場合、それぞれカスタムのユーザーモデルを実装した再利用可能アプリが2つあると、同時に使うことができなくなってしまいます。もしユーザー情報をアプリ度とに保存したい場合は、以下のように <code class=\"docutils literal notranslate\">settings.AUTH_USER_MODEL</code> に対して <a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> または <a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> を使用してください。</p>\n</section>\n<section id=\"referencing-the-user-model\">\n<h3><code class=\"docutils literal notranslate\">User</code> モデルを参照する<a class=\"heading-anchor\" href=\"#referencing-the-user-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> を直接参照する場合 (たとえば外部キーで参照する場合)、<a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> 設定が異なるユーザモデルに変更されたプロジェクトでは正しく動作しません。</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.get_user_model\">\n<span class=\"sig-name descname\">get_user_model</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.get_user_model\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> を直接参照する代わりに、<code class=\"docutils literal notranslate\">django.contrib.auth.get_user_model()</code> を使ってユーザモデルを参照すべきです。このメソッドは現在アクティブなユーザモデルを返します -- 指定されている場合はカスタムのユーザモデル、指定されていない場合は <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> です。</p>\n<p>ユーザモデルに対して外部キーや多対多の関係を定義するときは、<a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> 設定を使ってカスタムのモデルを指定してください。例えば:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.conf</span> <span class=\"kn\">import</span> settings\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Article</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    author <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        settings<span class=\"o\">.</span>AUTH_USER_MODEL<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>ユーザモデルによって送信されたシグナルと接続するときは、<a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> 設定を使ってカスタムのユーザモデルを指定してください。例えば:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.conf</span> <span class=\"kn\">import</span> settings\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models.signals</span> <span class=\"kn\">import</span> post_save\n\n\n<span class=\"k\">def</span> <span class=\"nf\">post_save_receiver</span><span class=\"p\">(</span>sender<span class=\"p\">,</span> instance<span class=\"p\">,</span> created<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n\npost_save<span class=\"o\">.</span>connect<span class=\"p\">(</span>post_save_receiver<span class=\"p\">,</span> sender<span class=\"o\">=</span>settings<span class=\"o\">.</span>AUTH_USER_MODEL<span class=\"p\">)</span>\n</code></pre></div>\n<p>一般的に言って、最も簡単な方法は、インポート時に実行されるコードの中で <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> 設定を用いてユーザーモデルを参照することです。しかし、Django がモデルをインポートするときに <code class=\"docutils literal notranslate\">get_user_model()</code> を呼ぶという方法もあります。こうすると、<code class=\"docutils literal notranslate\">models.ForeignKey(get_user_model(), ...)</code> という表記が可能です。</p>\n<p>たとえば、<code class=\"docutils literal notranslate\">&#64;override_settings(AUTH_USER_MODEL=...)</code> などを使用して、アプリが複数のユーザーモデルでテストされていて、<code class=\"docutils literal notranslate\">get_user_model()</code> の結果をモジュールレベルの変数にキャッシュしている場合、<a class=\"reference internal\" href=\"/ja/6.0/ref/signals/#django.test.signals.setting_changed\" title=\"django.test.signals.setting_changed\"><code class=\"xref py py-data docutils literal notranslate\">setting_changed</code></a> シグナルを listen してキャッシュをクリアする必要があるかもしれません。そのためには、次のように書きます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.apps</span> <span class=\"kn\">import</span> apps\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth</span> <span class=\"kn\">import</span> get_user_model\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.signals</span> <span class=\"kn\">import</span> setting_changed\n<span class=\"kn\">from</span> <span class=\"nn\">django.dispatch</span> <span class=\"kn\">import</span> receiver\n\n\n<span class=\"nd\">@receiver</span><span class=\"p\">(</span>setting_changed<span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">user_model_swapped</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"p\">,</span> setting<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    <span class=\"k\">if</span> setting <span class=\"o\">==</span> <span class=\"s2\">&quot;AUTH_USER_MODEL&quot;</span><span class=\"p\">:</span>\n        apps<span class=\"o\">.</span>clear_cache<span class=\"p\">()</span>\n        <span class=\"kn\">from</span> <span class=\"nn\">myapp</span> <span class=\"kn\">import</span> some_module\n\n        some_module<span class=\"o\">.</span>UserModel <span class=\"o\">=</span> get_user_model<span class=\"p\">()</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"specifying-a-custom-user-model\">\n<span id=\"specifying-custom-user-model\"></span><h3>カスタムのユーザーモデルを指定する<a class=\"heading-anchor\" href=\"#specifying-a-custom-user-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>プロジェクトの開始時にカスタムのユーザーモデルを使おうとしている場合、自分のプロジェクトにとってこの選択は本当に正しいのだろうか、と立ち止まってよく考えてください。</p>\n<p>ユーザーに関連するすべての情報を1つのモデルに記録すれば、関連モデルを取得するために、追加のより複雑なデータベースクエリを書く必要がなくなります。しかし一方で、アプリ固有のユーザー情報は、カスタムのユーザーモデルに関連するモデルに記録した方がより適切かもしれません。そうすることにより、各アプリは、他のアプリと競合したりデータを破壊されたりする可能性を考えずに、自分のアプリに必要なユーザーデータのみを指定できます。また、ユーザーモデルを、認証に焦点を絞った、可能な限りシンプルなものに保ち続けられるようになります。それはまた、Django がカスタムのユーザーモデルに期待する最小限の要求を満たすことにもなります。</p>\n<p>デフォルトの認証バックエンドを使用している場合、モデルは必ず、認証のために使用できるユニークなフィールドを1つ持たなければなりません。このフィールドとしては、ユーザー名やメールアドレスなど、ユニークな属性ならば使用できます。ユニークでないユーザー名などのフィールドが使用できるのは、そのようなフィールドを扱えるカスタムの認証バックエンドだけです。</p>\n<p>準拠したカスタムユーザーモデルを構築する最も簡単な方法は、<a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser\" title=\"django.contrib.auth.models.AbstractBaseUser\"><code class=\"xref py py-class docutils literal notranslate\">AbstractBaseUser</code></a> を継承することです。<a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser\" title=\"django.contrib.auth.models.AbstractBaseUser\"><code class=\"xref py py-class docutils literal notranslate\">AbstractBaseUser</code></a> はユーザーモデルのコアとなる実装を提供しており、その中には、ハッシュ化パスワードやトークン化されたパスワードリセットなどの機能が含まれます。このクラスの継承後、以下のように、キー実装の詳細を自分で記述する必要があります。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.CustomUser\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">CustomUser</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.CustomUser.USERNAME_FIELD\">\n<span class=\"sig-name descname\">USERNAME_FIELD</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser.USERNAME_FIELD\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユニークな ID として使用される、ユーザーモデルのフィールド名を説明する文字列。これは通常、ある種のユーザー名になりますが、メールアドレスや他のユニークな ID にすることもできます。非ユニークなユーザー名をサポートできるカスタムの認証バックエンドを使っていない限り、このフィールドは <em>必ず</em> ユニークである (たとえば、<code class=\"docutils literal notranslate\">unique=True</code> を定義内で設定する) 必要があります。</p>\n<p>以下の例では、フィールドを一意に指定するために、<code class=\"docutils literal notranslate\">identifier</code> フィールドが使われています。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyUser</span><span class=\"p\">(</span>AbstractBaseUser<span class=\"p\">):</span>\n    identifier <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">40</span><span class=\"p\">,</span> unique<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n    USERNAME_FIELD <span class=\"o\">=</span> <span class=\"s2\">&quot;identifier&quot;</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.CustomUser.EMAIL_FIELD\">\n<span class=\"sig-name descname\">EMAIL_FIELD</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser.EMAIL_FIELD\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザーモデルにあるメールのフィールド名を文字列で記述します。この値は <a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser.get_email_field_name\" title=\"django.contrib.auth.models.AbstractBaseUser.get_email_field_name\"><code class=\"xref py py-meth docutils literal notranslate\">get_email_field_name()</code></a> で返されます。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.CustomUser.REQUIRED_FIELDS\">\n<span class=\"sig-name descname\">REQUIRED_FIELDS</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser.REQUIRED_FIELDS\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"/ja/6.0/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\">createsuperuser</code></a> 管理コマンド経由でユーザーを作成するときにプロンプトが表示されるフィールド名のリスト。ユーザーはこれらの各フィールドごとに値を入力するようにプロンプトが表示されます。<a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\">blank</code></a> が <code class=\"docutils literal notranslate\">False</code> または未定義のフィールドを含む必要があり、ユーザーが対話的に作成されるときにプロンプトを表示したい追加のフィールドを含むことができます。<code class=\"docutils literal notranslate\">REQUIRED_FIELDS</code> は、たとえば admin 上のユーザーの作成などの Django の他の部分では何も効果がありません。</p>\n<p>たとえば、これは誕生日と身長の2つの必須フィールドを定義しているユーザーモデルの部分的な定義です。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyUser</span><span class=\"p\">(</span>AbstractBaseUser<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    date_of_birth <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n    height <span class=\"o\">=</span> models<span class=\"o\">.</span>FloatField<span class=\"p\">()</span>\n    <span class=\"o\">...</span>\n    REQUIRED_FIELDS <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;date_of_birth&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;height&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><code class=\"docutils literal notranslate\">REQUIRED_FIELDS</code> はユーザーモデルのすべての必須フィールドを含む必要がありますが、<code class=\"docutils literal notranslate\">USERNAME_FIELD</code> や <code class=\"docutils literal notranslate\">password</code> を含んでは <em>いけません</em> 。これらのフィールドは常に入力を求められるためです。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.CustomUser.is_active\">\n<span class=\"sig-name descname\">is_active</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser.is_active\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A boolean attribute that indicates whether the user is considered\n&quot;active&quot;. This attribute is provided as an attribute on\n<code class=\"docutils literal notranslate\">AbstractBaseUser</code> defaulting to <code class=\"docutils literal notranslate\">True</code>. How you choose to\nimplement it will depend on the details of your chosen auth backends.\nSee the documentation of the <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_active\" title=\"django.contrib.auth.models.User.is_active\"><code class=\"xref py py-attr docutils literal notranslate\">is_active attribute on the built-in\nuser model</code></a> for details.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.CustomUser.get_full_name\">\n<span class=\"sig-name descname\">get_full_name</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser.get_full_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>オプション。フルネームなどのユーザーに対するより長い正式の ID です。実装した場合、<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a> のオブジェクト履歴内でユーザー名とともに表示されます。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.CustomUser.get_short_name\">\n<span class=\"sig-name descname\">get_short_name</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser.get_short_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>オプション。ファーストネームなどのユーザーに対するより短い正式ではない ID です。実装した場合、<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a> のヘッダー内のユーザーへの挨拶内でユーザー名の代わりに使われます。</p>\n</dd></dl>\n\n<aside class=\"admonition-importing-abstractbaseuser admonition\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">AbstractBaseUser</code> のインポート</p>\n<p><code class=\"docutils literal notranslate\">AbstractBaseUser</code> と <code class=\"docutils literal notranslate\">BaseUserManager</code> は <code class=\"docutils literal notranslate\">django.contrib.auth.base_user</code> からインポートでき、 <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> の中に <code class=\"docutils literal notranslate\">django.contrib.auth</code> をインクルードすることなくインポートできます。</p>\n</aside>\n</dd></dl>\n\n<p>次の属性とメソッドは  <a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser\" title=\"django.contrib.auth.models.AbstractBaseUser\"><code class=\"xref py py-class docutils literal notranslate\">AbstractBaseUser</code></a>: の任意のサブクラスで利用可能です。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">AbstractBaseUser</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.get_username\">\n<span class=\"sig-name descname\">get_username</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.get_username\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">USERNAME_FIELD</code> で指定されたフィールドの値を返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.clean\">\n<span class=\"sig-name descname\">clean</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.clean\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser.normalize_username\" title=\"django.contrib.auth.models.AbstractBaseUser.normalize_username\"><code class=\"xref py py-meth docutils literal notranslate\">normalize_username()</code></a> を呼び出し、username を正規化します。このメソッドをオーバーライドした場合、正規化を保持するために <code class=\"docutils literal notranslate\">super()</code> を呼び出すようにしてください。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.get_email_field_name\">\n<em class=\"property\"><span class=\"k\">classmethod</span> </em><span class=\"sig-name descname\">get_email_field_name</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.get_email_field_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"#django.contrib.auth.models.CustomUser.EMAIL_FIELD\" title=\"django.contrib.auth.models.CustomUser.EMAIL_FIELD\"><code class=\"xref py py-attr docutils literal notranslate\">EMAIL_FIELD</code></a> 属性で指定されたメールフィールドの名前を返します。<code class=\"docutils literal notranslate\">EMAIL_FIELD</code> の指定が無いとき、デフォルトは <code class=\"docutils literal notranslate\">'email'</code> です。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.normalize_username\">\n<em class=\"property\"><span class=\"k\">classmethod</span> </em><span class=\"sig-name descname\">normalize_username</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">username</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.normalize_username\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>視覚的に同一であるが異なる Unicode の符号位置を持つ文字について、それらが同一とみなされるように、username に NFKC Unicode正規化を適用します。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.is_authenticated\">\n<span class=\"sig-name descname\">is_authenticated</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.is_authenticated\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>(<code class=\"docutils literal notranslate\">AnonymousUser.is_authenticated</code> が常に <code class=\"docutils literal notranslate\">False</code> なのとは対照的に) 常に <code class=\"docutils literal notranslate\">True</code> の読み取り専用属性です。ユーザが認証済みかどうかを知らせる方法です。これはパーミッションという意味ではなく、ユーザーがアクティブかどうか、また有効なセッションがあるかどうかをチェックするわけでもありません。 通常、<code class=\"docutils literal notranslate\">request.user</code> のこの属性をチェックして <a class=\"reference internal\" href=\"/ja/6.0/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">AuthenticationMiddleware</code></a> (現在ログイン中のユーザを表します) によって格納されているかどうかを調べます。<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> のインスタンスの場合、この属性は <code class=\"docutils literal notranslate\">True</code> となります。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.is_anonymous\">\n<span class=\"sig-name descname\">is_anonymous</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.is_anonymous\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>常に <code class=\"docutils literal notranslate\">False</code> の読み取り専用属性です。<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> オブジェクトと <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.AnonymousUser\" title=\"django.contrib.auth.models.AnonymousUser\"><code class=\"xref py py-class docutils literal notranslate\">AnonymousUser</code></a> オブジェクトを区別する方法です。一般的に、<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_authenticated\" title=\"django.contrib.auth.models.User.is_authenticated\"><code class=\"xref py py-attr docutils literal notranslate\">is_authenticated</code></a> を使う方が好ましいと言えます。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.set_password\">\n<span class=\"sig-name descname\">set_password</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">raw_password</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.set_password\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>指定された生の文字列に、ユーザのパスワードをセットし、パスワードのハッシュ処理を行います。<a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser\" title=\"django.contrib.auth.models.AbstractBaseUser\"><code class=\"xref py py-class docutils literal notranslate\">AbstractBaseUser</code></a> は保存しません。</p>\n<p>When the raw_password is <code class=\"docutils literal notranslate\">None</code>, the password will be set to an\nunusable password, as if\n<a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser.set_unusable_password\" title=\"django.contrib.auth.models.AbstractBaseUser.set_unusable_password\"><code class=\"xref py py-meth docutils literal notranslate\">set_unusable_password()</code></a>\nwere used.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.check_password\">\n<span class=\"sig-name descname\">check_password</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">raw_password</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.check_password\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.acheck_password\">\n<span class=\"sig-name descname\">acheck_password</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">raw_password</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.acheck_password\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>非同期バージョン</em>: <code class=\"docutils literal notranslate\">acheck_password()</code></p>\n<p>与えられた生の文字列が、ユーザに対して正しいパスワードであれば <code class=\"docutils literal notranslate\">True</code> を返します。 (比較する際にはパスワードハッシュを処理します。)</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.set_unusable_password\">\n<span class=\"sig-name descname\">set_unusable_password</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.set_unusable_password\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Marks the user as having no password set. This isn't the same as\nhaving a blank string for a password.\n<a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser.check_password\" title=\"django.contrib.auth.models.AbstractBaseUser.check_password\"><code class=\"xref py py-meth docutils literal notranslate\">check_password()</code></a> for\nthis user will never return <code class=\"docutils literal notranslate\">True</code>. Doesn't save the\n<a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser\" title=\"django.contrib.auth.models.AbstractBaseUser\"><code class=\"xref py py-class docutils literal notranslate\">AbstractBaseUser</code></a> object.</p>\n<p>アプリケーションの認証が LDAP ディレクトリなどの既存の外部ソースに対して行われている場合は、これが必要になることがあります。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.has_usable_password\">\n<span class=\"sig-name descname\">has_usable_password</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.has_usable_password\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns <code class=\"docutils literal notranslate\">False</code> if\n<a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser.set_unusable_password\" title=\"django.contrib.auth.models.AbstractBaseUser.set_unusable_password\"><code class=\"xref py py-meth docutils literal notranslate\">set_unusable_password()</code></a>\nhas been called for this user.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash\">\n<span class=\"sig-name descname\">get_session_auth_hash</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>パスワードフィールドの HAMC を返します。<a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#session-invalidation-on-password-change\"><span class=\"std std-ref\">パスワード変更時にセッションを無効化する</span></a> ために利用されます。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractBaseUser.get_session_auth_fallback_hash\">\n<span class=\"sig-name descname\">get_session_auth_fallback_hash</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.get_session_auth_fallback_hash\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-SECRET_KEY_FALLBACKS\"><code class=\"xref std std-setting docutils literal notranslate\">SECRET_KEY_FALLBACKS</code></a> を使用しているパスワードフィールドの HMAC を yield します。<code class=\"docutils literal notranslate\">get_user()</code> で使用されます。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p><a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractUser\" title=\"django.contrib.auth.models.AbstractUser\"><code class=\"xref py py-class docutils literal notranslate\">AbstractUser</code></a> は <a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser\" title=\"django.contrib.auth.models.AbstractBaseUser\"><code class=\"xref py py-class docutils literal notranslate\">AbstractBaseUser</code></a> をサブクラス化します。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractUser\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">AbstractUser</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractUser\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.AbstractUser.clean\">\n<span class=\"sig-name descname\">clean</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractUser.clean\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"#django.contrib.auth.models.BaseUserManager.normalize_email\" title=\"django.contrib.auth.models.BaseUserManager.normalize_email\"><code class=\"xref py py-meth docutils literal notranslate\">BaseUserManager.normalize_email()</code></a> を呼び出し、メールを正規化します。このメソッドをオーバーライドした場合、正規化を保持するために必ず <code class=\"docutils literal notranslate\">super()</code> を呼び出すようにしてください。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"writing-a-manager-for-a-custom-user-model\">\n<h3>カスタムユーザーモデルのためのマネージャーを書く<a class=\"heading-anchor\" href=\"#writing-a-manager-for-a-custom-user-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>また、ユーザモデルに対してカスタムマネージャを定義する必要があります。ユーザモデルが <code class=\"docutils literal notranslate\">username</code>, <code class=\"docutils literal notranslate\">email</code>, <code class=\"docutils literal notranslate\">is_staff</code>, <code class=\"docutils literal notranslate\">is_active</code>, <code class=\"docutils literal notranslate\">is_superuser</code>, <code class=\"docutils literal notranslate\">last_login</code>, <code class=\"docutils literal notranslate\">date_joined</code> フィールドを Django のデフォルトユーザと同じように定義している場合、 Django の <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.UserManager\" title=\"django.contrib.auth.models.UserManager\"><code class=\"xref py py-class docutils literal notranslate\">UserManager</code></a> をインストールできます。しかし、ユーザモデルが異なるフィールドを定義している場合は、 <a class=\"reference internal\" href=\"#django.contrib.auth.models.BaseUserManager\" title=\"django.contrib.auth.models.BaseUserManager\"><code class=\"xref py py-class docutils literal notranslate\">BaseUserManager</code></a> を継承して、さらに 2 つのメソッドを提供するカスタムマネージャを定義する必要があります:</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.CustomUserManager\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">CustomUserManager</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUserManager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.CustomUserManager.create_user\">\n<span class=\"sig-name descname\">create_user</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">username_field</em>, <em class=\"sig-param\">password<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>other_fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUserManager.create_user\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">create_user()</code> のプロトタイプは、ユーザ名フィールドとすべての必須フィールドを引数として受け取る必要があります。たとえば、ユーザーモデルがユーザー名フィールドとして <code class=\"docutils literal notranslate\">email</code> を使用し、必須フィールドとして <code class=\"docutils literal notranslate\">date_of_birth</code> を持つ場合、 <code class=\"docutils literal notranslate\">create_user</code> は次のように定義します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">create_user</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> email<span class=\"p\">,</span> date_of_birth<span class=\"p\">,</span> password<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"c1\"># create user here</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.CustomUserManager.create_superuser\">\n<span class=\"sig-name descname\">create_superuser</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">username_field</em>, <em class=\"sig-param\">password<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>other_fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUserManager.create_superuser\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">create_superuser()</code> のプロトタイプは、ユーザ名フィールドとすべての必須フィールドを引数として受け取る必要があります。たとえば、ユーザーモデルがユーザー名フィールドとして <code class=\"docutils literal notranslate\">email</code> を使用し、必須フィールドとして <code class=\"docutils literal notranslate\">date_of_birth</code> を持つ場合、 <code class=\"docutils literal notranslate\">create_superuser</code> は次のように定義します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">create_superuser</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> email<span class=\"p\">,</span> date_of_birth<span class=\"p\">,</span> password<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"c1\"># create superuser here</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</dd></dl>\n\n</dd></dl>\n\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> の <a class=\"reference internal\" href=\"#django.contrib.auth.models.CustomUser.USERNAME_FIELD\" title=\"django.contrib.auth.models.CustomUser.USERNAME_FIELD\"><code class=\"xref py py-attr docutils literal notranslate\">USERNAME_FIELD</code></a> または <a class=\"reference internal\" href=\"#django.contrib.auth.models.CustomUser.REQUIRED_FIELDS\" title=\"django.contrib.auth.models.CustomUser.REQUIRED_FIELDS\"><code class=\"xref py py-attr docutils literal notranslate\">REQUIRED_FIELDS</code></a> の場合、これらのメソッドは既存のインスタンスの <a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.ForeignKey.to_field\" title=\"django.db.models.ForeignKey.to_field\"><code class=\"xref py py-attr docutils literal notranslate\">to_field</code></a> (デフォルトでは <a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\">primary_key</code></a>) の値を受け取ります。</p>\n<p><a class=\"reference internal\" href=\"#django.contrib.auth.models.BaseUserManager\" title=\"django.contrib.auth.models.BaseUserManager\"><code class=\"xref py py-class docutils literal notranslate\">BaseUserManager</code></a> は以下のユーティリティメソッドを提供します:</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.BaseUserManager\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">BaseUserManager</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.BaseUserManager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.BaseUserManager.normalize_email\">\n<em class=\"property\"><span class=\"k\">classmethod</span> </em><span class=\"sig-name descname\">normalize_email</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">email</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.BaseUserManager.normalize_email\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>メールアドレスのドメイン部分を小文字にすることで、メールアドレスを正規化します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.BaseUserManager.get_by_natural_key\">\n<span class=\"sig-name descname\">get_by_natural_key</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">username</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.BaseUserManager.get_by_natural_key\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.BaseUserManager.aget_by_natural_key\">\n<span class=\"sig-name descname\">aget_by_natural_key</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">username</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.BaseUserManager.aget_by_natural_key\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>非同期バージョン</em>: <code class=\"docutils literal notranslate\">aget_by_natural_key()</code></p>\n<p><code class=\"docutils literal notranslate\">USERNAME_FIELD</code> で指定されたフィールドの内容を使用してユーザーインスタンスを取得します。</p>\n<aside class=\"version-note version-changed\" data-version=\"5.2\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 5.2</p><p><code class=\"docutils literal notranslate\">aget_by_natural_key()</code> メソッドが追加されました。</p>\n</aside>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"extending-django-s-default-user\">\n<h3>Django 標準の <code class=\"docutils literal notranslate\">User</code> を拡張する<a class=\"heading-anchor\" href=\"#extending-django-s-default-user\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django の <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> モデルに完全に満足しているものの、追加のプロフィール情報をいくつか追加したい場合、<a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractUser\" title=\"django.contrib.auth.models.AbstractUser\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.auth.models.AbstractUser</code></a> をサブクラス化して、カスタムのプロフィールフィールドを追加することも可能ですが、<a class=\"reference internal\" href=\"#specifying-custom-user-model\"><span class=\"std std-ref\">カスタムのユーザーモデルを指定する</span></a> で説明されているように、独立したモデルを作ることをおすすめします。<code class=\"docutils literal notranslate\">AbstractUser</code> は、デフォルトの <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> の完全な実装を <a class=\"reference internal\" href=\"/ja/6.0/topics/db/models/#abstract-base-classes\"><span class=\"std std-ref\">抽象モデル</span></a> として提供します。</p>\n</section>\n<section id=\"custom-users-and-the-built-in-auth-forms\">\n<span id=\"id2\"></span><h3>カスタムのユーザーとビルトインの認証フォーム<a class=\"heading-anchor\" href=\"#custom-users-and-the-built-in-auth-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django のビルトインの <a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#built-in-auth-forms\"><span class=\"std std-ref\">フォーム</span></a> と <a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#built-in-auth-views\"><span class=\"std std-ref\">ビュー</span></a> は、協調して動作するユーザーモデルに対して、いくつかの前提を置いています。</p>\n<p>以下のフォームは <a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser\" title=\"django.contrib.auth.models.AbstractBaseUser\"><code class=\"xref py py-class docutils literal notranslate\">AbstractBaseUser</code></a> のあらゆるサブクラスに互換性があります。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#django.contrib.auth.forms.AuthenticationForm\" title=\"django.contrib.auth.forms.AuthenticationForm\"><code class=\"xref py py-class docutils literal notranslate\">AuthenticationForm</code></a>: <a class=\"reference internal\" href=\"#django.contrib.auth.models.CustomUser.USERNAME_FIELD\" title=\"django.contrib.auth.models.CustomUser.USERNAME_FIELD\"><code class=\"xref py py-attr docutils literal notranslate\">USERNAME_FIELD</code></a> で指定したユーザー名フィールドを使用する。</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#django.contrib.auth.forms.SetPasswordForm\" title=\"django.contrib.auth.forms.SetPasswordForm\"><code class=\"xref py py-class docutils literal notranslate\">SetPasswordForm</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#django.contrib.auth.forms.PasswordChangeForm\" title=\"django.contrib.auth.forms.PasswordChangeForm\"><code class=\"xref py py-class docutils literal notranslate\">PasswordChangeForm</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#django.contrib.auth.forms.AdminPasswordChangeForm\" title=\"django.contrib.auth.forms.AdminPasswordChangeForm\"><code class=\"xref py py-class docutils literal notranslate\">AdminPasswordChangeForm</code></a></p></li>\n</ul>\n<p>以下のフォームは、ユーザーモデルについて以下のようないくつか前提を置いています。これらの前提を満たしている場合、同じユーザーモデルとみなして使用できます。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#django.contrib.auth.forms.PasswordResetForm\" title=\"django.contrib.auth.forms.PasswordResetForm\"><code class=\"xref py py-class docutils literal notranslate\">PasswordResetForm</code></a>: ユーザモデルには、ユーザのメールアドレスを格納するフィールドがあり、 <a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser.get_email_field_name\" title=\"django.contrib.auth.models.AbstractBaseUser.get_email_field_name\"><code class=\"xref py py-meth docutils literal notranslate\">get_email_field_name()</code></a> (デフォルトでは <code class=\"docutils literal notranslate\">email</code>) によって返される名前がユーザを識別するために使用され、 <code class=\"docutils literal notranslate\">is_active</code> という真偽値フィールドがアクティブでないユーザのパスワードリセットを防ぐために使用されると仮定します。</p></li>\n</ul>\n<p>最後に、以下のフォームは、<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> と固く結びついているため、カスタムのユーザーモデルとともに使用するには、書き換えや拡張が必要になります。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#django.contrib.auth.forms.UserCreationForm\" title=\"django.contrib.auth.forms.UserCreationForm\"><code class=\"xref py py-class docutils literal notranslate\">UserCreationForm</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#django.contrib.auth.forms.UserChangeForm\" title=\"django.contrib.auth.forms.UserChangeForm\"><code class=\"xref py py-class docutils literal notranslate\">UserChangeForm</code></a></p></li>\n</ul>\n<p>カスタムユーザモデルが <code class=\"docutils literal notranslate\">AbstractUser</code> のサブクラスであれば、次ようにフォームを拡張できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.forms</span> <span class=\"kn\">import</span> UserCreationForm\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> CustomUser\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CustomUserCreationForm</span><span class=\"p\">(</span>UserCreationForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">(</span>UserCreationForm<span class=\"o\">.</span>Meta<span class=\"p\">):</span>\n        model <span class=\"o\">=</span> CustomUser\n        fields <span class=\"o\">=</span> UserCreationForm<span class=\"o\">.</span>Meta<span class=\"o\">.</span>fields <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"s2\">&quot;custom_field&quot;</span><span class=\"p\">,)</span>\n</code></pre></div>\n</section>\n<section id=\"custom-users-and-django-contrib-admin\">\n<h3>カスタムのユーザーと <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a><a class=\"heading-anchor\" href=\"#custom-users-and-django-contrib-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>カスタムのユーザーモデルを admin で動作させたい場合、ユーザーモデルにいくつかの追加の属性とメソッドを定義しなければなりません。これらのメソッドを定義することで、admin はユーザーへアクセスを制御して admin のコンテンツに合わせることができます。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">CustomUser</span></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.is_staff\">\n<span class=\"sig-name descname\">is_staff</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.is_staff\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザーが admin サイトへのアクセス権を持っている時、<code class=\"docutils literal notranslate\">True</code> を返します。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.is_active\">\n<span class=\"sig-name descname\">is_active</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.is_active\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザーアカウントが現在アクティブな時、<code class=\"docutils literal notranslate\">True</code> を返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\">\n<span class=\"sig-name descname\">has_perm(perm, obj=None):</span></dt>\n<dd><p>ユーザーが名前付きの権限を持っている時、<code class=\"docutils literal notranslate\">True</code> を返します。<code class=\"docutils literal notranslate\">obj</code> が提供された場合、特定のオブジェクトのインスタンスに対して権限をチェックする必要があります。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\">\n<span class=\"sig-name descname\">has_module_perms(app_label):</span></dt>\n<dd><p>ユーザーが与えられたアプリ内のモデルへのアクセス権を持っている場合、<code class=\"docutils literal notranslate\">True</code> を返します。</p>\n</dd></dl>\n\n<p>また、カスタムユーザークラスを admin に登録する必要もあります。もしカスタムユーザーモデルが <code class=\"docutils literal notranslate\">django.contrib.auth.models.AbstractUser</code> を継承したものである場合、Django の既存の <code class=\"docutils literal notranslate\">django.contrib.auth.admin.UserAdmin</code> クラスがそのまま利用できます。しかし、ユーザーモデルが <a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser\" title=\"django.contrib.auth.models.AbstractBaseUser\"><code class=\"xref py py-class docutils literal notranslate\">AbstractBaseUser</code></a> を継承したものである場合には、カスタムの <code class=\"docutils literal notranslate\">ModelAdmin</code> クラスを定義する必要があります。デフォルトの <code class=\"docutils literal notranslate\">django.contrib.auth.admin.UserAdmin</code> をサブクラス化することも可能ですが、その場合には <code class=\"docutils literal notranslate\">django.contrib.auth.models.AbstractUser</code> 上のフィールドを参照する定義のうち、カスタムユーザークラス上にはない定義をすべてオーバーライドする必要があるでしょう。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><code class=\"docutils literal notranslate\">django.contrib.auth.admin.UserAdmin</code> のサブクラスである <code class=\"docutils literal notranslate\">ModelAdmin</code> を使用する場合、<code class=\"docutils literal notranslate\">fieldsets</code> (ユーザーの変更時に使われるフィールド) および <code class=\"docutils literal notranslate\">add_fieldsets</code> (ユーザーの作成時に使われるフィールド) に自分のカスタムフィールドを追加する必要があります。たとえば、次のように書くことができます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.admin</span> <span class=\"kn\">import</span> UserAdmin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CustomUserAdmin</span><span class=\"p\">(</span>UserAdmin<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    fieldsets <span class=\"o\">=</span> UserAdmin<span class=\"o\">.</span>fieldsets <span class=\"o\">+</span> <span class=\"p\">((</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;custom_field&quot;</span><span class=\"p\">]}),)</span>\n    add_fieldsets <span class=\"o\">=</span> UserAdmin<span class=\"o\">.</span>add_fieldsets <span class=\"o\">+</span> <span class=\"p\">((</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;custom_field&quot;</span><span class=\"p\">]}),)</span>\n</code></pre></div>\n<p>詳細は、<a class=\"reference internal\" href=\"#custom-users-admin-full-example\"><span class=\"std std-ref\">完全な例</span></a> のページを参照してください。</p>\n</aside>\n</section>\n<section id=\"custom-users-and-permissions\">\n<h3>カスタムのユーザーとパーミッション<a class=\"heading-anchor\" href=\"#custom-users-and-permissions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django のパーミッションフレームワークをカスタムのユーザーモデルに簡単に取り入れられるように用意されているのが、Django の <a class=\"reference internal\" href=\"#django.contrib.auth.models.PermissionsMixin\" title=\"django.contrib.auth.models.PermissionsMixin\"><code class=\"xref py py-class docutils literal notranslate\">PermissionsMixin</code></a> です。これはユーザーモデルの階層に取り入れることができる抽象モデルで、Django のパーミッションモデルをサポートするのに必要なすべてのメソッドとデーターベースのフィールドを使えるようにしてくれます。</p>\n<p><a class=\"reference internal\" href=\"#django.contrib.auth.models.PermissionsMixin\" title=\"django.contrib.auth.models.PermissionsMixin\"><code class=\"xref py py-class docutils literal notranslate\">PermissionsMixin</code></a> は、以下のメソッドと属性を提供します。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.PermissionsMixin\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">PermissionsMixin</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.PermissionsMixin.is_superuser\">\n<span class=\"sig-name descname\">is_superuser</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.is_superuser\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>真偽値です。明示的に与えられない場合でも、ユーザーがが全てのパーミッションを持っているかどうかを示します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.PermissionsMixin.get_user_permissions\">\n<span class=\"sig-name descname\">get_user_permissions</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.get_user_permissions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザーが直接持っているパーミッション文字列のセットを返します。</p>\n<p>もし <code class=\"docutils literal notranslate\">obj</code> が渡された場合、この特定のオブジェクトのユーザパーミッションのみを返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.PermissionsMixin.get_group_permissions\">\n<span class=\"sig-name descname\">get_group_permissions</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.get_group_permissions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザがグループを通して持つパーミッションの文字列のセットを返します。</p>\n<p><code class=\"docutils literal notranslate\">obj</code> が渡されたとき、指定されたオブジェクトに対するグループパーミッションのみを返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.PermissionsMixin.get_all_permissions\">\n<span class=\"sig-name descname\">get_all_permissions</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.get_all_permissions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザがグループおよびユーザパーミッションを通して持つパーミッションの文字列のセットを返します。</p>\n<p><code class=\"docutils literal notranslate\">obj</code> が渡された場合、指定されたオブジェクトに対するパーミッションのみを返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.PermissionsMixin.has_perm\">\n<span class=\"sig-name descname\">has_perm</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">perm</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.has_perm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザーが指定したパーミッションを持っている場合、<code class=\"docutils literal notranslate\">True</code> を返します。ここで、<code class=\"docutils literal notranslate\">perm</code> は <code class=\"docutils literal notranslate\">&quot;&lt;app label&gt;.&lt;permission codename&gt;&quot;</code> という形式で指定します (<a class=\"reference internal\" href=\"/ja/6.0/topics/auth/default/#topic-authorization\"><span class=\"std std-ref\">パーミッション</span></a> を参照)。もし、<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_active\" title=\"django.contrib.auth.models.User.is_active\"><code class=\"xref py py-attr docutils literal notranslate\">User.is_active</code></a> と <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_superuser\" title=\"django.contrib.auth.models.User.is_superuser\"><code class=\"xref py py-attr docutils literal notranslate\">is_superuser</code></a> が両方とも <code class=\"docutils literal notranslate\">True</code> だった場合、このメソッドは常に <code class=\"docutils literal notranslate\">True</code> を返します。</p>\n<p><code class=\"docutils literal notranslate\">obj</code> が渡された場合、このメソッドはモデルに対するパーミッションのチェックを行わず、指定されたオブジェクトに対して行います。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.PermissionsMixin.has_perms\">\n<span class=\"sig-name descname\">has_perms</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">perm_list</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.has_perms\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザーが指定したパーミッションを持っている場合、<code class=\"docutils literal notranslate\">True</code> を返します。ここで、<code class=\"docutils literal notranslate\">perm</code> は <code class=\"docutils literal notranslate\">&quot;&lt;app label&gt;.&lt;permission codename&gt;&quot;</code> という形式で指定します。もし、<a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_active\" title=\"django.contrib.auth.models.User.is_active\"><code class=\"xref py py-attr docutils literal notranslate\">User.is_active</code></a> と <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_superuser\" title=\"django.contrib.auth.models.User.is_superuser\"><code class=\"xref py py-attr docutils literal notranslate\">is_superuser</code></a> が両方とも <code class=\"docutils literal notranslate\">True</code> だった場合、このメソッドは常に <code class=\"docutils literal notranslate\">True</code> を返します。</p>\n<p><code class=\"docutils literal notranslate\">obj</code> が渡された場合、このメソッドは指定されたオブジェクトに対してパーミッションのチェックを行い、モデルに対しては行いません。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.PermissionsMixin.has_module_perms\">\n<span class=\"sig-name descname\">has_module_perms</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">package_name</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.has_module_perms\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ユーザが指定されたパッケージ（Django アプリのラベル）に何らかのパーミッションを持っている場合、 <code class=\"docutils literal notranslate\">True</code> を返します。 <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_active\" title=\"django.contrib.auth.models.User.is_active\"><code class=\"xref py py-attr docutils literal notranslate\">User.is_active</code></a> と <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User.is_superuser\" title=\"django.contrib.auth.models.User.is_superuser\"><code class=\"xref py py-attr docutils literal notranslate\">is_superuser</code></a> が両方 <code class=\"docutils literal notranslate\">True</code> なら、このメソッドは常に <code class=\"docutils literal notranslate\">True</code> を返します。</p>\n</dd></dl>\n\n</dd></dl>\n\n<aside class=\"admonition-permissionsmixin-and-modelbackend admonition\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">PermissionsMixin</code> と <code class=\"docutils literal notranslate\">ModelBackend</code></p>\n<p><a class=\"reference internal\" href=\"#django.contrib.auth.models.PermissionsMixin\" title=\"django.contrib.auth.models.PermissionsMixin\"><code class=\"xref py py-class docutils literal notranslate\">PermissionsMixin</code></a> をインクルードしていない場合、 <code class=\"docutils literal notranslate\">ModelBackend</code> のパーミッションメソッドを呼び出してはいけません。 <code class=\"docutils literal notranslate\">ModelBackend</code> は、ユーザモデルで特定のフィールドが利用可能であることを想定しています。ユーザモデルがこれらのフィールドを提供していない場合、パーミッションをチェックするとデータベースエラーになります。</p>\n</aside>\n</section>\n<section id=\"custom-users-and-proxy-models\">\n<h3>カスタムのユーザーと proxy モデル<a class=\"heading-anchor\" href=\"#custom-users-and-proxy-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>カスタムユーザモデルの制限の一つは、カスタムユーザモデルをインストールすると、 <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> を拡張するプロキシモデルが壊れてしまうことです。プロキシモデルは具象基底クラスを継承している必要があります。カスタムユーザモデルを定義すると、 Django が基底クラスを確実に識別する方法を奪ってしまいます。</p>\n<p>プロジェクトでプロキシモデルを使用している場合、プロキシを変更してプロジェクトで使用しているユーザーモデルを拡張するか、プロキシの動作を <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\">User</code></a> サブクラスにマージする必要があります。</p>\n</section>\n<section id=\"a-full-example\">\n<span id=\"custom-users-admin-full-example\"></span><h3>完全な具体例<a class=\"heading-anchor\" href=\"#a-full-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>以下は admin に準拠したカスタムユーザーアプリの例です。このユーザモデルはユーザ名としてメールアドレスを使用し、生年月日を必須とします。ユーザーアカウントに <code class=\"docutils literal notranslate\">admin</code> フラグを立てるだけで、権限のチェックは行いません。このモデルはユーザー作成フォームを除く、すべての組み込みの認証フォームとビューと互換性があります。このサンプルはほとんどのコンポーネントがどう連携して動作するかの例であり、実運用のためのプロジェクトに直接コピーされることを想定したものではありません。</p>\n<p>このコードはすべてカスタム認証アプリの <code class=\"docutils literal notranslate\">models.py</code> ファイルに格納されます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> BaseUserManager<span class=\"p\">,</span> AbstractBaseUser\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyUserManager</span><span class=\"p\">(</span>BaseUserManager<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">create_user</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> email<span class=\"p\">,</span> date_of_birth<span class=\"p\">,</span> password<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Creates and saves a User with the given email, date of</span>\n<span class=\"sd\">        birth and password.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> <span class=\"ow\">not</span> email<span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Users must have an email address&quot;</span><span class=\"p\">)</span>\n\n        user <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>model<span class=\"p\">(</span>\n            email<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>normalize_email<span class=\"p\">(</span>email<span class=\"p\">),</span>\n            date_of_birth<span class=\"o\">=</span>date_of_birth<span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n\n        user<span class=\"o\">.</span>set_password<span class=\"p\">(</span>password<span class=\"p\">)</span>\n        user<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>_db<span class=\"p\">)</span>\n        <span class=\"k\">return</span> user\n\n    <span class=\"k\">def</span> <span class=\"nf\">create_superuser</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> email<span class=\"p\">,</span> date_of_birth<span class=\"p\">,</span> password<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Creates and saves a superuser with the given email, date of</span>\n<span class=\"sd\">        birth and password.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        user <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>create_user<span class=\"p\">(</span>\n            email<span class=\"p\">,</span>\n            password<span class=\"o\">=</span>password<span class=\"p\">,</span>\n            date_of_birth<span class=\"o\">=</span>date_of_birth<span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n        user<span class=\"o\">.</span>is_admin <span class=\"o\">=</span> <span class=\"kc\">True</span>\n        user<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>_db<span class=\"p\">)</span>\n        <span class=\"k\">return</span> user\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyUser</span><span class=\"p\">(</span>AbstractBaseUser<span class=\"p\">):</span>\n    email <span class=\"o\">=</span> models<span class=\"o\">.</span>EmailField<span class=\"p\">(</span>\n        verbose_name<span class=\"o\">=</span><span class=\"s2\">&quot;email address&quot;</span><span class=\"p\">,</span>\n        max_length<span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">,</span>\n        unique<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    date_of_birth <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n    is_active <span class=\"o\">=</span> models<span class=\"o\">.</span>BooleanField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    is_admin <span class=\"o\">=</span> models<span class=\"o\">.</span>BooleanField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n    objects <span class=\"o\">=</span> MyUserManager<span class=\"p\">()</span>\n\n    USERNAME_FIELD <span class=\"o\">=</span> <span class=\"s2\">&quot;email&quot;</span>\n    REQUIRED_FIELDS <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;date_of_birth&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>email\n\n    <span class=\"k\">def</span> <span class=\"nf\">has_perm</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> perm<span class=\"p\">,</span> obj<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"s2\">&quot;Does the user have a specific permission?&quot;</span>\n        <span class=\"c1\"># Simplest possible answer: Yes, always</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">has_module_perms</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> app_label<span class=\"p\">):</span>\n        <span class=\"s2\">&quot;Does the user have permissions to view the app `app_label`?&quot;</span>\n        <span class=\"c1\"># Simplest possible answer: Yes, always</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n    <span class=\"nd\">@property</span>\n    <span class=\"k\">def</span> <span class=\"nf\">is_staff</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"s2\">&quot;Is the user a member of staff?&quot;</span>\n        <span class=\"c1\"># Simplest possible answer: All admins are staff</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>is_admin\n</code></pre></div>\n<p>そして、このカスタムユーザモデルを Django の admin に登録するには、アプリの <code class=\"docutils literal notranslate\">admin.py</code> ファイルに以下のコードが必要になります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> Group\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.admin</span> <span class=\"kn\">import</span> UserAdmin <span class=\"k\">as</span> BaseUserAdmin\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.forms</span> <span class=\"kn\">import</span> ReadOnlyPasswordHashField\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.exceptions</span> <span class=\"kn\">import</span> ValidationError\n\n<span class=\"kn\">from</span> <span class=\"nn\">customauth.models</span> <span class=\"kn\">import</span> MyUser\n\n\n<span class=\"k\">class</span> <span class=\"nc\">UserCreationForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;A form for creating new users. Includes all the required</span>\n<span class=\"sd\">    fields, plus a repeated password.&quot;&quot;&quot;</span>\n\n    password1 <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>label<span class=\"o\">=</span><span class=\"s2\">&quot;Password&quot;</span><span class=\"p\">,</span> widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>PasswordInput<span class=\"p\">)</span>\n    password2 <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>\n        label<span class=\"o\">=</span><span class=\"s2\">&quot;Password confirmation&quot;</span><span class=\"p\">,</span> widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>PasswordInput\n    <span class=\"p\">)</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> MyUser\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;date_of_birth&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">clean_password2</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Check that the two password entries match</span>\n        password1 <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;password1&quot;</span><span class=\"p\">)</span>\n        password2 <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;password2&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> password1 <span class=\"ow\">and</span> password2 <span class=\"ow\">and</span> password1 <span class=\"o\">!=</span> password2<span class=\"p\">:</span>\n            <span class=\"k\">raise</span> ValidationError<span class=\"p\">(</span><span class=\"s2\">&quot;Passwords don&#39;t match&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> password2\n\n    <span class=\"k\">def</span> <span class=\"nf\">save</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> commit<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Save the provided password in hashed format</span>\n        user <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>save<span class=\"p\">(</span>commit<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n        user<span class=\"o\">.</span>set_password<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>cleaned_data<span class=\"p\">[</span><span class=\"s2\">&quot;password1&quot;</span><span class=\"p\">])</span>\n        <span class=\"k\">if</span> commit<span class=\"p\">:</span>\n            user<span class=\"o\">.</span>save<span class=\"p\">()</span>\n        <span class=\"k\">return</span> user\n\n\n<span class=\"k\">class</span> <span class=\"nc\">UserChangeForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;A form for updating users. Includes all the fields on</span>\n<span class=\"sd\">    the user, but replaces the password field with admin&#39;s</span>\n<span class=\"sd\">    disabled password hash display field.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    password <span class=\"o\">=</span> ReadOnlyPasswordHashField<span class=\"p\">()</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> MyUser\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;password&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;date_of_birth&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;is_active&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;is_admin&quot;</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">UserAdmin</span><span class=\"p\">(</span>BaseUserAdmin<span class=\"p\">):</span>\n    <span class=\"c1\"># The forms to add and change user instances</span>\n    form <span class=\"o\">=</span> UserChangeForm\n    add_form <span class=\"o\">=</span> UserCreationForm\n\n    <span class=\"c1\"># The fields to be used in displaying the User model.</span>\n    <span class=\"c1\"># These override the definitions on the base UserAdmin</span>\n    <span class=\"c1\"># that reference specific fields on auth.User.</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;date_of_birth&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;is_admin&quot;</span><span class=\"p\">]</span>\n    list_filter <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;is_admin&quot;</span><span class=\"p\">]</span>\n    fieldsets <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;password&quot;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;Personal info&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;date_of_birth&quot;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;Permissions&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;is_admin&quot;</span><span class=\"p\">]}),</span>\n    <span class=\"p\">]</span>\n    <span class=\"c1\"># add_fieldsets is not a standard ModelAdmin attribute. UserAdmin</span>\n    <span class=\"c1\"># overrides get_fieldsets to use this attribute when creating a user.</span>\n    add_fieldsets <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span>\n            <span class=\"kc\">None</span><span class=\"p\">,</span>\n            <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;classes&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;wide&quot;</span><span class=\"p\">],</span>\n                <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;date_of_birth&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;password1&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;password2&quot;</span><span class=\"p\">],</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n    search_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">]</span>\n    ordering <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">]</span>\n    filter_horizontal <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n\n<span class=\"c1\"># Now register the new UserAdmin...</span>\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>MyUser<span class=\"p\">,</span> UserAdmin<span class=\"p\">)</span>\n<span class=\"c1\"># ... and, since we&#39;re not using Django&#39;s built-in permissions,</span>\n<span class=\"c1\"># unregister the Group model from admin.</span>\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>unregister<span class=\"p\">(</span>Group<span class=\"p\">)</span>\n</code></pre></div>\n<p>最後に、 <code class=\"docutils literal notranslate\">settings.py</code>: の <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> 設定を使用して、カスタムモデルをプロジェクトのデフォルトのユーザーモデルとして指定します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>AUTH_USER_MODEL <span class=\"o\">=</span> <span class=\"s2\">&quot;customauth.MyUser&quot;</span>\n</code></pre></div>\n<section id=\"adding-an-async-interface\">\n<span id=\"writing-authentication-backends-async-interface\"></span><h4>非同期インターフェースを追加する<a class=\"heading-anchor\" href=\"#adding-an-async-interface\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-added\" data-version=\"5.2\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.2</p></aside>\n<p>非同期コンテキストから呼び出される際のパフォーマンスを最適化するために、認証バックエンドは各関数の非同期版 ( <code class=\"docutils literal notranslate\">aget_user(user_id)</code> および <code class=\"docutils literal notranslate\">aauthenticate(request, **credentials)</code> ) を実装できます。認証バックエンドが <code class=\"docutils literal notranslate\">BaseBackend</code> を継承していて、これらの非同期関数を提供していない場合は、自動的に <code class=\"docutils literal notranslate\">sync_to_async</code> でラップされます。ただし、この方法には <a class=\"reference internal\" href=\"/ja/6.0/topics/async/#async-performance\"><span class=\"std std-ref\">パフォーマンスペナルティ</span></a> が伴います。</p>\n<p>非同期インターフェースの実装は任意ですが、同期インターフェースは常に必要です。非同期インターフェースを実装していても、同期インターフェースが自動的に補完されることはありません。</p>\n<p>Django に標準で用意されている認証バックエンドは、ネイティブで非同期処理に対応しています。これらのバックエンドを継承して機能を拡張する場合は、変更した関数の非同期版も忘れずに対応させるよう注意してください。</p>\n</section>\n</section>\n</section>","rootId":"customizing-authentication-in-django","toc":[{"title":"他の認証ソースを利用する","anchor":"other-authentication-sources","children":[{"title":"認証バックエンドを指定する","anchor":"specifying-authentication-backends","children":[]},{"title":"認証バックエンドの実装","anchor":"writing-an-authentication-backend","children":[]},{"title":"カスタムバックエンドによる認可の扱い","anchor":"handling-authorization-in-custom-backends","children":[{"title":"匿名ユーザーに対する認可","anchor":"authorization-for-anonymous-users","children":[]},{"title":"アクティブでないユーザーに対する認可","anchor":"authorization-for-inactive-users","children":[]},{"title":"オブジェクトのパーミッションの取扱い","anchor":"handling-object-permissions","children":[]}]}]},{"title":"カスタムパーミッション","anchor":"custom-permissions","children":[]},{"title":"既存の User モデルを拡張する","anchor":"extending-the-existing-user-model","children":[]},{"title":"カスタムの User モデルを置き換える","anchor":"substituting-a-custom-user-model","children":[{"title":"プロジェクトの開始時にカスタムのユーザーモデルを使用する","anchor":"using-a-custom-user-model-when-starting-a-project","children":[]},{"title":"プロジェクト途中からのカスタムユーザーモデルへの変更","anchor":"changing-to-a-custom-user-model-mid-project","children":[]},{"title":"再利用可能なアプリと AUTH_USER_MODEL","anchor":"reusable-apps-and-auth-user-model","children":[]},{"title":"User モデルを参照する","anchor":"referencing-the-user-model","children":[]},{"title":"カスタムのユーザーモデルを指定する","anchor":"specifying-a-custom-user-model","children":[]},{"title":"カスタムユーザーモデルのためのマネージャーを書く","anchor":"writing-a-manager-for-a-custom-user-model","children":[]},{"title":"Django 標準の User を拡張する","anchor":"extending-django-s-default-user","children":[]},{"title":"カスタムのユーザーとビルトインの認証フォーム","anchor":"custom-users-and-the-built-in-auth-forms","children":[]},{"title":"カスタムのユーザーと django.contrib.admin","anchor":"custom-users-and-django-contrib-admin","children":[]},{"title":"カスタムのユーザーとパーミッション","anchor":"custom-users-and-permissions","children":[]},{"title":"カスタムのユーザーと proxy モデル","anchor":"custom-users-and-proxy-models","children":[]},{"title":"完全な具体例","anchor":"a-full-example","children":[{"title":"非同期インターフェースを追加する","anchor":"adding-an-async-interface","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/6.0/topics/"},{"docname":"topics/auth/index","title":"Django でのユーザー認証","url":"/ja/6.0/topics/auth/"}],"prev":{"docname":"topics/auth/passwords","title":"Djangoにおけるパスワード管理","url":"/ja/6.0/topics/auth/passwords/"},"next":{"docname":"topics/cache","title":"Django のキャッシュフレームワーク","url":"/ja/6.0/topics/cache/"},"formats":{"html":"/ja/6.0/topics/auth/customizing/","markdown":"/ja/6.0/topics/auth/customizing.md","json":"/ja/6.0/topics/auth/customizing.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/auth/customizing.txt","official":"https://docs.djangoproject.com/ja/6.0/topics/auth/customizing/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}