{"title":"Personalizando a autenticação no Django","version":"6.0","locale":"pt-br","docname":"topics/auth/customizing","url":"/pt-br/6.0/topics/auth/customizing/","canonical":"https://djangodocs.dev/pt-br/6.0/topics/auth/customizing/","summary":"A autenticação que vem com o Django é boa o suficiente para os casos mais comuns, mas você pode ter necessidades não atendidas pelo padrão out-of-the-box.…","html":"<h1>Personalizando a autenticação no Django<a class=\"heading-anchor\" href=\"#customizing-authentication-in-django\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>A autenticação que vem com o Django é boa o suficiente para os casos mais comuns, mas você pode ter necessidades não atendidas pelo padrão out-of-the-box. Personalizar a autenticação em seus projetos requer entender que pontos do sistema fornecido são extensíveis ou substituíveis. Este documento fornece detalhes sobre como o sistema de autenticação pode ser personalizado.</p>\n<p><a class=\"reference internal\" href=\"#authentication-backends\"><span class=\"std std-ref\">Authentication backends</span></a>  fornece um sistema extensível para quando um nome de usuário e uma senha, armazenados com o modelo de usuário, precisam ser autenticados contra um serviço diferente do padrão do Django.</p>\n<p>Você pode dar para seus models  <a class=\"reference internal\" href=\"#custom-permissions\"><span class=\"std std-ref\">permissões customizadas</span></a> que pode ser conferidas através do sistema de autorização do Django.</p>\n<p>Você pode <a class=\"reference internal\" href=\"#extending-user\"><span class=\"std std-ref\">extender</span></a> o modelo <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> padrão, ou <a class=\"reference internal\" href=\"#auth-custom-user\"><span class=\"std std-ref\">substituir</span></a> por um modelo completamente personalizado.</p>\n<section id=\"other-authentication-sources\">\n<span id=\"authentication-backends\"></span><h2>Outras fontes de autenticação<a class=\"heading-anchor\" href=\"#other-authentication-sources\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pode haver várias vezes que você precise enganchar em outro código de autenticação, outro código de usuário ou senha ou métodos de autenticação.</p>\n<p>Por exemplo, sua companhia pode já ter um LDAP configurado que armazena o usuário e a senha para cada empregado. Isto é um aborrecimento para ambos administradores de rede e os próprios usuários se os usuários tiverem contas separadas em LDAP e a aplicação baseada em Django.</p>\n<p>Então, para lidar com situações como está, o sistema de autenticação do Django deixa você conectá-lo em outras fontes de autenticação. Você pode sobrescrever o esquema padrão baseado em banco de dados, ou você pode usar o sistema padrão em conjunto com outros sistemas.</p>\n<p>Veja a <a class=\"reference internal\" href=\"/pt-br/6.0/ref/contrib/auth/#authentication-backends-reference\"><span class=\"std std-ref\">referência do backend de autenticação</span></a> para informação sobre backends de autenticação incluída com Django.</p>\n<section id=\"specifying-authentication-backends\">\n<h3>Especificando backends de autenticação<a class=\"heading-anchor\" href=\"#specifying-authentication-backends\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Behind the scenes, Django maintains a list of “authentication backends” that it\nchecks for authentication. When somebody calls\n<a class=\"reference internal\" href=\"/pt-br/6.0/topics/auth/default/#django.contrib.auth.authenticate\" title=\"django.contrib.auth.authenticate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.authenticate()</span></code></a> – as described in <a class=\"reference internal\" href=\"/pt-br/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 lista de backends autenticação usada é especificada na definição <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code></a>. Isto deve ser uma lista de nomes de caminhos Python que apontam para classes Python que sabem como autenticar. Essas classes podem estar em qualquer lugar no seu caminho Python (python path).</p>\n<p>Por padrão, <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">:settings:`AUTHENTICATION_BACKENDS`</span></a> é definido como:</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>That’s the basic authentication backend that checks the Django users database\nand queries the built-in permissions. It does not provide protection against\nbrute force attacks via any rate limiting mechanism. You may either implement\nyour own rate limiting mechanism in a custom auth backend, or use the\nmechanisms provided by most web servers.</p>\n<p>A ordem dos <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">:settings:`AUTHENTICATION_BACKENDS`</span></a> importa, então se o mesmo usuário e senha são válidos em múltiplos backends, Django vai parar de processar na primeira combinação  positiva.</p>\n<p>Se um “backends” emitir uma exceção <a class=\"reference internal\" href=\"/pt-br/6.0/ref/exceptions/#django.core.exceptions.PermissionDenied\" title=\"django.core.exceptions.PermissionDenied\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PermissionDenied</span></code></a>, a autenticação irá falhar imediatamente. Django não irá verificar os próximos “backends”.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Once a user has authenticated, Django stores which backend was used to\nauthenticate the user in the user’s session, and reuses the same backend\nfor the duration of that session whenever access to the currently\nauthenticated user is needed. This effectively means that authentication\nsources are cached on a per-session basis, so if you change\n<a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code></a>, you’ll need to clear out session data\nif you need to force users to re-authenticate using different methods. A\nsimple way to do that is to execute <code class=\"docutils literal notranslate\"><span class=\"pre\">Session.objects.all().delete()</span></code>.</p>\n</aside>\n</section>\n<section id=\"writing-an-authentication-backend\">\n<h3>Desenvolvendo um backend de autenticação<a class=\"heading-anchor\" href=\"#writing-an-authentication-backend\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Um backend de autenticação é uma classe que implementa dois métodos obirgatórios: <code class=\"docutils literal notranslate\"><span class=\"pre\">get_user(user_id)</span></code> e o <code class=\"docutils literal notranslate\"><span class=\"pre\">authenticate(request,</span> <span class=\"pre\">**credentials)</span></code>, assim como um conjunto opcional de <a class=\"reference internal\" href=\"#authorization-methods\"><span class=\"std std-ref\">métodos de autorização</span></a> relacionados a permissão.</p>\n<p>O método <code class=\"docutils literal notranslate\"><span class=\"pre\">get_user</span></code> recebe um <code class=\"docutils literal notranslate\"><span class=\"pre\">user_id</span></code> – o qual pode ser um username, ID do banco de dados ou outr coisa qualquer, mas tem que ser uma chave-primária do seu objeto user – e retorna um objeto user ou <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>.</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">authenticate</span></code> method takes a <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> argument and credentials as\nkeyword arguments. Most of the time, it’ll look like this:</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=\"w\"> </span><span class=\"nn\">django.contrib.auth.backends</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseBackend</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyBackend</span><span class=\"p\">(</span><span class=\"n\">BaseBackend</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">authenticate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">username</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">password</span><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>Mas ele poderia também autenticar um token, tal qual:</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=\"w\"> </span><span class=\"nn\">django.contrib.auth.backends</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseBackend</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyBackend</span><span class=\"p\">(</span><span class=\"n\">BaseBackend</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">authenticate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">token</span><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>Da mesma maneira, o <code class=\"docutils literal notranslate\"><span class=\"pre\">authenticate()</span></code> deve verificar as credenciais que recebe e retornar um objeto do tipo “user” que combine com aquelas credenciais se estas forem válidas. Se estas não forem válidas, ele deve retornar <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>.</p>\n<p>O <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> é uma <a class=\"reference internal\" href=\"/pt-br/6.0/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> e pode ser <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> se não foi fornecido para a <a class=\"reference internal\" href=\"/pt-br/6.0/topics/auth/default/#django.contrib.auth.authenticate\" title=\"django.contrib.auth.authenticate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">authenticate()</span></code></a> (a qual o passa para o backend).</p>\n<p>The Django admin is tightly coupled to the Django <a class=\"reference internal\" href=\"/pt-br/6.0/topics/auth/default/#user-objects\"><span class=\"std std-ref\">User object</span></a>. For example, for a user to access the admin,\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User.is_staff</span></code></a> and <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User.is_active</span></code></a> must be <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> (see\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">AdminSite.has_permission()</span></code></a> for details).</p>\n<p>The best way to deal with this is to create a Django <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> object for each\nuser that exists for your backend (e.g., in your LDAP directory, your external\nSQL database, etc.). You can either write a script to do this in advance, or\nyour <code class=\"docutils literal notranslate\"><span class=\"pre\">authenticate</span></code> method can do it the first time a user logs in.</p>\n<p>Here’s an example backend that authenticates against a username and password\nvariable defined in your <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> file and creates a Django <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code>\nobject the first time a user authenticates. In this example, the created Django\n<code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> object is a superuser who will have full access to the 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=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.backends</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseBackend</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.hashers</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">check_password</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SettingsBackend</span><span class=\"p\">(</span><span class=\"n\">BaseBackend</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><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=\"w\"> </span><span class=\"nf\">authenticate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">username</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"n\">login_valid</span> <span class=\"o\">=</span> <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">ADMIN_LOGIN</span> <span class=\"o\">==</span> <span class=\"n\">username</span>\n        <span class=\"n\">pwd_valid</span> <span class=\"o\">=</span> <span class=\"n\">check_password</span><span class=\"p\">(</span><span class=\"n\">password</span><span class=\"p\">,</span> <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">ADMIN_PASSWORD</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">login_valid</span> <span class=\"ow\">and</span> <span class=\"n\">pwd_valid</span><span class=\"p\">:</span>\n            <span class=\"k\">try</span><span class=\"p\">:</span>\n                <span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"n\">username</span><span class=\"p\">)</span>\n            <span class=\"k\">except</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><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                <span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">User</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"n\">username</span><span class=\"p\">)</span>  <span class=\"c1\"># is_active defaults to True.</span>\n                <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_staff</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n                <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_superuser</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n                <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"k\">return</span> <span class=\"n\">user</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_user</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">user_id</span><span class=\"p\">):</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">user_id</span><span class=\"p\">)</span>\n        <span class=\"k\">except</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><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>Lidando com autorização em bakends personalizados<a class=\"heading-anchor\" href=\"#handling-authorization-in-custom-backends\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Backends de autenticação customizados podem fornecer suas próprias permissões</p>\n<p>The user model and its manager will delegate permission lookup functions\n(<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">get_user_permissions()</span></code></a>,\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">get_group_permissions()</span></code></a>,\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">get_all_permissions()</span></code></a>,\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">has_perm()</span></code></a>,\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">has_module_perms()</span></code></a>, and\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">with_perm()</span></code></a>) to any\nauthentication backend that implements these functions.</p>\n<p>As permissões dadas para o usuário será um super-conjunto de todas as permissões devolvidas de todos os back-ends . Ou seja , o Django concede uma permissão para um usuário que qualquer backend conceder.</p>\n<p>If a backend raises a <a class=\"reference internal\" href=\"/pt-br/6.0/ref/exceptions/#django.core.exceptions.PermissionDenied\" title=\"django.core.exceptions.PermissionDenied\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PermissionDenied</span></code></a>\nexception in <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">has_perm()</span></code></a> or\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">has_module_perms()</span></code></a>, the authorization\nwill immediately fail and Django won’t check the backends that follow.</p>\n<p>A backend could implement permissions for the magic admin like this:</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=\"w\"> </span><span class=\"nn\">django.contrib.auth.backends</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseBackend</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MagicAdminBackend</span><span class=\"p\">(</span><span class=\"n\">BaseBackend</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">has_perm</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">user_obj</span><span class=\"p\">,</span> <span class=\"n\">perm</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">user_obj</span><span class=\"o\">.</span><span class=\"n\">username</span> <span class=\"o\">==</span> <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">ADMIN_LOGIN</span>\n</code></pre></div>\n<p>Isso dá permissão total para o usuário para qual o acesso foi concedido no exemplo acima. Note que além dos mesmos argumentos dados as funções associadas ao usuário, todas as funções do “backend” de autenticação recebem o objeto user, o qual talvez seja um usuário anônimo, como argumento.</p>\n<p>A full authorization implementation can be found in the <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code> class\nin <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>, which is the default backend and\nqueries the <code class=\"docutils literal notranslate\"><span class=\"pre\">auth_permission</span></code> table most of the time.</p>\n<section id=\"authorization-for-anonymous-users\">\n<span id=\"anonymous-auth\"></span><h4>Autorização para usuários anônimos<a class=\"heading-anchor\" href=\"#authorization-for-anonymous-users\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Um usuário anônimo é um que não está autenticado poe exemplo ele forneceu detalhes de autenticação não válidos. Todavia, isso não quer dizer necessariamente que eles não estão autorizados a fazer nada. Em um nível mais básico, a maioria dos websites autorizam usuário anônimos a navegar a maior parte do site, e muitos permitem enviar comentários e etc.</p>\n<p>Django’s permission framework does not have a place to store permissions for\nanonymous users. However, the user object passed to an authentication backend\nmay be an <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">django.contrib.auth.models.AnonymousUser</span></code></a> object, allowing\nthe backend to specify custom authorization behavior for anonymous users. This\nis especially useful for the authors of reusable apps, who can delegate all\nquestions of authorization to the auth backend, rather than needing settings,\nfor example, to control anonymous access.</p>\n</section>\n<section id=\"authorization-for-inactive-users\">\n<span id=\"inactive-auth\"></span><h4>Autorização para usuários inativos<a class=\"heading-anchor\" href=\"#authorization-for-inactive-users\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Um “user” inativo é o aquele que tem seu campo  <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">is_active</span></code></a> definido como <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Os backends de autenticação <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">ModelBackend</span></code></a> e <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">RemoteUserBackend</span></code></a> não permitem que este usuário se autentique. Se um modelo personalizado de “user” não tem o <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\"><span class=\"pre\">is_active</span></code></a>, todos os usuários serão permitidos a se autenticar.</p>\n<p>Você pode usar a <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">AllowAllUsersModelBackend</span></code></a> ou <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">AllowAllUsersRemoteUserBackend</span></code></a> se quiser que usuários inativos se autentiquem.</p>\n<p>O suporte para usuários anônimos no sistema de permissão permite um cenário onde usuários anônimos tem permissões de fazer alguma coisa enquanto usuário autenticados inativos não.</p>\n<p>Não se esqueça de testar o atributo <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> do usuário nos métodos de permissão do seu próprio backend.</p>\n</section>\n<section id=\"handling-object-permissions\">\n<h4>Manipulação de permissões de objeto<a class=\"heading-anchor\" href=\"#handling-object-permissions\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>O framework de permissões do Django tem uma “foundation” para objetos de permissões, embora não haja uma implementação para isso no core. Isso significa que a verificação para permissões de objetos sempre retorna <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> ou uma lista vazia (dependendo da verificação realizada). Um “backend” de autenticação receberá os parâmetros nomeados <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">user_obj</span></code> para cada método de autorização relacionado com o objeto e pode retornar o nível de permissão do objeto como for apropriado.</p>\n</section>\n</section>\n</section>\n<section id=\"custom-permissions\">\n<span id=\"id1\"></span><h2>Permissões personalizadas<a class=\"heading-anchor\" href=\"#custom-permissions\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Para criar permissões persaonalizadas para um dado objeto de modelo, use o <code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code> <a class=\"reference internal\" href=\"/pt-br/6.0/topics/db/models/#meta-options\"><span class=\"std std-ref\">model Meta attribute</span></a>.</p>\n<p>This example <code class=\"docutils literal notranslate\"><span class=\"pre\">Task</span></code> model creates two custom permissions, i.e., actions users\ncan or cannot do with <code class=\"docutils literal notranslate\"><span class=\"pre\">Task</span></code> instances, specific to your application:</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=\"w\"> </span><span class=\"nc\">Task</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">permissions</span> <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>The only thing this does is create those extra permissions when you run\n<a class=\"reference internal\" href=\"/pt-br/6.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code></a> (the function that creates permissions\nis connected to the <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">post_migrate</span></code></a> signal).\nYour code is in charge of checking the value of these permissions when a user\nis trying to access the functionality provided by the application (changing the\nstatus of tasks or closing tasks.) Continuing the above example, the following\nchecks if a user may close tasks:</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=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">has_perm</span><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>Estendendo o modelo <code class=\"docutils literal notranslate\"><span class=\"pre\">Usuário</span></code> existente<a class=\"heading-anchor\" href=\"#extending-the-existing-user-model\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Existem duas maneiras de estender o modelo padrão <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a> sem substituir seu próprio modelo. Se as mnudanças que precisa são puramente comprtamentais, e nao requerem nenhuma mudança no que é armazenado no banco de dados, você pode criar um <a class=\"reference internal\" href=\"/pt-br/6.0/topics/db/models/#proxy-models\"><span class=\"std std-ref\">proxy model</span></a>  baseado na  <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a>. Isso permite qualquer das funcionalidades oferecidas pelo modelo “proxy” incluindo “ordering” padrão, “managers” personalizados ou métodos persononalizados do modelo.</p>\n<p>Se você deseja armazenar informação relacionada ao <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code>, você pode usar a <a class=\"reference internal\" href=\"/pt-br/6.0/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> para um modelo contento os campos para a informação adicional. Este modelo com relação um-pra-um é muitas vezes chamado modelo de perfil, uma vez que poderia armazenar infomração que nao está relacionada com autenticação sobre o usuário do site. Por exemplo você poderia criar um modelo “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=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Employee</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">OneToOneField</span><span class=\"p\">(</span><span class=\"n\">User</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">department</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Assuming an existing Employee Fred Smith who has both a User and Employee\nmodel, you can access the related information using Django’s standard related\nmodel conventions:</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><span class=\"n\">u</span> <span class=\"o\">=</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s2\">&quot;fsmith&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">freds_department</span> <span class=\"o\">=</span> <span class=\"n\">u</span><span class=\"o\">.</span><span class=\"n\">employee</span><span class=\"o\">.</span><span class=\"n\">department</span>\n</code></pre></div>\n<p>Para adicionar os campos do modelo de perfil para uma página de usuário no admin, defina uma <a class=\"reference internal\" href=\"/pt-br/6.0/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">InlineModelAdmin</span></code></a> (para este exemplo, iremos usar uma <a class=\"reference internal\" href=\"/pt-br/6.0/ref/contrib/admin/#django.contrib.admin.StackedInline\" title=\"django.contrib.admin.StackedInline\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StackedInline</span></code></a>) no <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> da sua aplicação e a adicione a classe <code class=\"docutils literal notranslate\"><span class=\"pre\">UserAdmin</span></code> a qual é registrada com a classe <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></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=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.admin</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UserAdmin</span> <span class=\"k\">as</span> <span class=\"n\">BaseUserAdmin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">my_user_profile_app.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Employee</span>\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=\"w\"> </span><span class=\"nc\">EmployeeInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">StackedInline</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Employee</span>\n    <span class=\"n\">can_delete</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"n\">verbose_name_plural</span> <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=\"w\"> </span><span class=\"nc\">UserAdmin</span><span class=\"p\">(</span><span class=\"n\">BaseUserAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">inlines</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">EmployeeInline</span><span class=\"p\">]</span>\n\n\n<span class=\"c1\"># Re-register UserAdmin</span>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">unregister</span><span class=\"p\">(</span><span class=\"n\">User</span><span class=\"p\">)</span>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">User</span><span class=\"p\">,</span> <span class=\"n\">UserAdmin</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Os modelos “profile” não são especiais de maneira alguma - eles são apenas modelos Django que possuem uma relação um-para-um com o modelo “user”. Assim sendo, eles não são criados automaticamente quando um usuário é criado, más um <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">django.db.models.signals.post_save</span></code></a> pode ser usado para criar ou atualizar um modelo relacionado se for apropriado.</p>\n<p>Usar modelos relacionados resultam em “queries” adicionais ou “joins” para retornar os dados relacionados. Dependendo de suas necessidades, talvez seja uma melhor opção um modelo “user” customizado que inclua os campos relacionados, porém, relações com o modelo “user” já existente dentro das apps do seu projeto talvez justifiquem a carga extra do banco de dados.</p>\n</section>\n<section id=\"substituting-a-custom-user-model\">\n<span id=\"auth-custom-user\"></span><h2>Substituindo um modelo de <code class=\"docutils literal notranslate\"><span class=\"pre\">Usuário</span></code> personalizado<a class=\"heading-anchor\" href=\"#substituting-a-custom-user-model\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Alguns tipos de projetos talvez tenham requerimentos de autenticação para as quais o modelo <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a> embutido do Django nem sempre é apropriado. Por exemplo, em alguns sites tenha mais sentido usar um endereço de e-mail como seu “token” de identificação no lugar de um nome de usuáro.</p>\n<p>O Django permite que você sobrescreva o modelo “user” padrão, fornecendo um valor para o <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a> definindo a referência para um modelo personalizado:</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=\"n\">AUTH_USER_MODEL</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;myapp.MyUser&quot;</span>\n</code></pre></div>\n<p>This dotted pair describes the <a class=\"reference internal\" href=\"/pt-br/6.0/ref/applications/#django.apps.AppConfig.label\" title=\"django.apps.AppConfig.label\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">label</span></code></a> of the\nDjango app (which must be in your <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>), and the name of\nthe Django model that you wish to use as your user model.</p>\n<section id=\"using-a-custom-user-model-when-starting-a-project\">\n<h3>Usando um modelo de usuário personalizado quando iniciando um projeto<a class=\"heading-anchor\" href=\"#using-a-custom-user-model-when-starting-a-project\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If you’re starting a new project, you can set up a custom user model that\nbehaves identically to the default user model by subclassing\n<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\"><span class=\"pre\">AbstractUser</span></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=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AbstractUser</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">User</span><span class=\"p\">(</span><span class=\"n\">AbstractUser</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Não se esqueça de indicá-lo no <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a>. Faça isso antes de criar qualquer migração ou antes de rodar um <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code> pela primeira vez.</p>\n<p>Além disso, registre o model no app’s ‘’admin.py’’:</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=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.admin</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UserAdmin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">User</span><span class=\"p\">,</span> <span class=\"n\">UserAdmin</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"changing-to-a-custom-user-model-mid-project\">\n<h3>Mudando para um modelo “user” personalizado no meio do projeto<a class=\"heading-anchor\" href=\"#changing-to-a-custom-user-model-mid-project\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Changing <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a> after you’ve created database tables is\npossible, but can be complex, since it affects foreign keys and many-to-many\nrelationships, for example.</p>\n<p>Está modificação não pode ser feita automaticamente e requer um conserto manual do esquema, movendo os dados da antiga tabela de usuários e, possivelmente reaplicando manualmente algumas migrações. Veja <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/25313\">#25313</a> para um esboço das etapas.</p>\n<p>Devido às limitações do recurso de dependência dinâmica do Django para modelos intercambiáveis, o modelo referenciado por <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a> deve ser criado na primeira migração do seu aplicativo (usualmente chamada de <code class=\"docutils literal notranslate\"><span class=\"pre\">0001_initial</span></code>); caso contrário, você terá problemas de dependência.</p>\n<p>Além disso, você pode ter um `` CircularDependencyError`` ao executar suas migrações, pois o Django não será capaz de quebrar automaticamente o loop de dependência devido à dependência dinâmica. Se você tiver este erro, você deverá quebrar o loop movendo os modelos dependentes, do seu modelo de usuário, para uma segunda migração. (Você pode tentar criando dois modelos normais, onde cada um possui uma <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> para o outro e  ver como o <code class=\"docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code> resolve essa dependência circular.)</p>\n</section>\n<section id=\"reusable-apps-and-auth-user-model\">\n<h3>Apps reusáveis e <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code><a class=\"heading-anchor\" href=\"#reusable-apps-and-auth-user-model\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Aplicações reutilizáveis não devem implmentar um modelo de usuário personalizado. Um projeto pode usar muitas aplicações, e duas aplicações reutilizáveis que implementam um modelo de usuário personalizado não poderiam ser usadas juntas. Se você precisa armazenar informação por usuário na sua aplicação, use um <a class=\"reference internal\" href=\"/pt-br/6.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> ou <a class=\"reference internal\" href=\"/pt-br/6.0/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> para o <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.AUTH_USER_MODEL</span></code> como descrito abaixo.</p>\n</section>\n<section id=\"referencing-the-user-model\">\n<h3>Referenciando o modelo <code class=\"docutils literal notranslate\"><span class=\"pre\">Usuário</span></code><a class=\"heading-anchor\" href=\"#referencing-the-user-model\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Se você referênciar diretamente <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a> (por exemplo, referenciando ele em uma chave estrangeira), seu código não ira funcionar em projetos onde a configuração <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a> tenha sido modificada para um modelo de usuário diferente.</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\"><span class=\"pre\">get_user_model</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ao invés de fazer uma referencia direta ao <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a>, você deve referenciar o modelo do usuário usando o <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.get_user_model()</span></code>. Este método irá retornar o modelo de usuário ativo no momento – o modelo de usuário personalizado se este estiver especificado, ou se não, o <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a>.</p>\n<p>Quando se define uma chave estrangeira ou relacionamentos muitos-para-muitos com o modelo de usuário, você deve especificar o modelo personalizado usando a definição <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a>. Por exemplo:</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=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">AUTH_USER_MODEL</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>Quando conectar a sinais enviados pelo modelo de usuário, você deve especificar o modelo personalizado definindo o <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a>. Por exemplo:</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=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.signals</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">post_save</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">post_save_receiver</span><span class=\"p\">(</span><span class=\"n\">sender</span><span class=\"p\">,</span> <span class=\"n\">instance</span><span class=\"p\">,</span> <span class=\"n\">created</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n\n<span class=\"n\">post_save</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">(</span><span class=\"n\">post_save_receiver</span><span class=\"p\">,</span> <span class=\"n\">sender</span><span class=\"o\">=</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">AUTH_USER_MODEL</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>De um modo geral, é mais fácil se referir ao modelo do usuário com o <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a> definindo no código que é executado no momento da importação, no entanto também é possível chamar <code class=\"docutils literal notranslate\"><span class=\"pre\">get_user_model()</span></code> enquanto o Django esta importando modelos, para que você possa usar <code class=\"docutils literal notranslate\"><span class=\"pre\">models.ForeignKey(get_user_model(),</span> <span class=\"pre\">...)</span></code>.</p>\n<p>If your app is tested with multiple user models, using\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;override_settings(AUTH_USER_MODEL=...)</span></code> for example, and you cache the\nresult of <code class=\"docutils literal notranslate\"><span class=\"pre\">get_user_model()</span></code> in a module-level variable, you may need to\nlisten to the  <a class=\"reference internal\" href=\"/pt-br/6.0/ref/signals/#django.test.signals.setting_changed\" title=\"django.test.signals.setting_changed\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">setting_changed</span></code></a> signal to clear\nthe cache. For example:</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=\"w\"> </span><span class=\"nn\">django.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">apps</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_user_model</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.signals</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">setting_changed</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.dispatch</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">receiver</span>\n\n\n<span class=\"nd\">@receiver</span><span class=\"p\">(</span><span class=\"n\">setting_changed</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">user_model_swapped</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"p\">,</span> <span class=\"n\">setting</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">setting</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;AUTH_USER_MODEL&quot;</span><span class=\"p\">:</span>\n        <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">clear_cache</span><span class=\"p\">()</span>\n        <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">some_module</span>\n\n        <span class=\"n\">some_module</span><span class=\"o\">.</span><span class=\"n\">UserModel</span> <span class=\"o\">=</span> <span class=\"n\">get_user_model</span><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>Definindo um modelo de usuário personalizado.<a class=\"heading-anchor\" href=\"#specifying-a-custom-user-model\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When you start your project with a custom user model, stop to consider if this\nis the right choice for your project.</p>\n<p>Keeping all user related information in one model removes the need for\nadditional or more complex database queries to retrieve related models. On the\nother hand, it may be more suitable to store app-specific user information in a\nmodel that has a relation with your custom user model. That allows each app to\nspecify its own user data requirements without potentially conflicting or\nbreaking assumptions by other apps. It also means that you would keep your user\nmodel as simple as possible, focused on authentication, and following the\nminimum requirements Django expects custom user models to meet.</p>\n<p>Se você usa o “backend” padrão de autenticação, então seu modelo deve ter um único campo “unique” que possa ser usado com o propósito de identificação. Isso pode ser um nome de usuário, um endereço de e-mail, ou qualquer atributo “unique”. Um nome de usuário que permita duplicaidade é permitido se você usar um “backend” de autenticação que dê suporte a isso.</p>\n<p>A maneira mais fácil de construir um modelo de usuário personalizado compatível é herdar de  <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\"><span class=\"pre\">AbstractBaseUser</span></code></a>. 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\"><span class=\"pre\">AbstractBaseUser</span></code></a> fornece o mínimo necessário para implementar um modelo de usuário, incluindo senhas criptografadas e “resets” de senha. Você deve então fornecer alguns detalhes chaves da implementação:</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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">CustomUser</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser\"><span class=\"visually-hidden\">Link para esta definição</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\"><span class=\"pre\">USERNAME_FIELD</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser.USERNAME_FIELD\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A string describing the name of the field on the user model that is\nused as the unique identifier. This will usually be a username of some\nkind, but it can also be an email address, or any other unique\nidentifier. The field <em>must</em> be unique (e.g. have <code class=\"docutils literal notranslate\"><span class=\"pre\">unique=True</span></code> set\nin its definition), unless you use a custom authentication backend that\ncan support non-unique usernames.</p>\n<p>No exemplo seguinte, o campo <code class=\"docutils literal notranslate\"><span class=\"pre\">identifier</span></code> é usado como o campo identificador:</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=\"w\"> </span><span class=\"nc\">MyUser</span><span class=\"p\">(</span><span class=\"n\">AbstractBaseUser</span><span class=\"p\">):</span>\n    <span class=\"n\">identifier</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">40</span><span class=\"p\">,</span> <span class=\"n\">unique</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n    <span class=\"n\">USERNAME_FIELD</span> <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\"><span class=\"pre\">EMAIL_FIELD</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser.EMAIL_FIELD\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A string describing the name of the email field on the <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> model.\nThis value is returned by\n<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\"><span class=\"pre\">get_email_field_name()</span></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\"><span class=\"pre\">REQUIRED_FIELDS</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser.REQUIRED_FIELDS\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Um lista de nomes de campos que serão demandados quando criar um usuário através do coando de gerenciamento <a class=\"reference internal\" href=\"/pt-br/6.0/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createsuperuser</span></code></a>. O usuário será demandado a fornecer um valor para cada um destes campos. Isso deve incluir qualquer campo para o qual o <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">blank</span></code></a> é <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> ou indefinido e pode incluir campos adicionais que você queira demandar quando o usuário for criado interativamente. O  <code class=\"docutils literal notranslate\"><span class=\"pre\">REQUIRED_FIELDS</span></code> não tem efeito em outras partes do Django, como criar um usuario no admin.</p>\n<p>Por exemplo, aqui é a definição parcial para um modelo de usuário que define dois campos obrigatórios - data de nascimento e peso:</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=\"w\"> </span><span class=\"nc\">MyUser</span><span class=\"p\">(</span><span class=\"n\">AbstractBaseUser</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"n\">date_of_birth</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">height</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FloatField</span><span class=\"p\">()</span>\n    <span class=\"o\">...</span>\n    <span class=\"n\">REQUIRED_FIELDS</span> <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\">Nota</p>\n<p>O <code class=\"docutils literal notranslate\"><span class=\"pre\">REQUIRED_FIELDS</span></code> deve conter todos os campos obrigatórios do seu modelo de usuário, mas <em>não</em> deve conter o <code class=\"docutils literal notranslate\"><span class=\"pre\">USERNAME_FIELD</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">password</span></code> já que estes campos serão sempre requeridos.</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\"><span class=\"pre\">is_active</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUser.is_active\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A boolean attribute that indicates whether the user is considered\n“active”. This attribute is provided as an attribute on\n<code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBaseUser</span></code> defaulting to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></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=\"/pt-br/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\"><span class=\"pre\">is_active</span> <span class=\"pre\">attribute</span> <span class=\"pre\">on</span> <span class=\"pre\">the</span> <span class=\"pre\">built-in</span>\n<span class=\"pre\">user</span> <span class=\"pre\">model</span></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\"><span class=\"pre\">get_full_name</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Optional. A longer formal identifier for the user such as their full\nname. If implemented, this appears alongside the username in an\nobject’s history in <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">django.contrib.admin</span></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\"><span class=\"pre\">get_short_name</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Optional. A short, informal identifier for the user such as their\nfirst name. If implemented, this replaces the username in the greeting\nto the user in the header of <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">django.contrib.admin</span></code></a>.</p>\n</dd></dl>\n\n<aside class=\"admonition-importing-abstractbaseuser admonition\">\n<p class=\"admonition-title\">Importando “AbstractBaseUser”</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBaseUser</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseUserManager</span></code> are importable from\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.base_user</span></code> so that they can be imported without\nincluding <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code> in <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p>\n</aside>\n</dd></dl>\n\n<p>Os atributos e métodos a seguir estão disponíveis em qualquer subclasse de <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\"><span class=\"pre\">AbstractBaseUser</span></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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">AbstractBaseUser</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser\"><span class=\"visually-hidden\">Link para esta definição</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\"><span class=\"pre\">get_username</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Retorna o valor do campo denominado no <code class=\"docutils literal notranslate\"><span class=\"pre\">USERNAME_FIELD</span></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\"><span class=\"pre\">clean</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Normaliza o nome de usuário chamando <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\"><span class=\"pre\">normalize_username()</span></code></a>. Se sobreescrever este método, lembre-se de chamar o <code class=\"docutils literal notranslate\"><span class=\"pre\">super()</span></code> para manter a normlização.</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\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">get_email_field_name</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns the name of the email field specified by the\n<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\"><span class=\"pre\">EMAIL_FIELD</span></code></a> attribute. Defaults to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'email'</span></code> if <code class=\"docutils literal notranslate\"><span class=\"pre\">EMAIL_FIELD</span></code> isn’t specified.</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\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">normalize_username</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">username</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.normalize_username\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Aplica normalização NFKC de UNICODE para nomes de usuários de modo que caracteres visualmente idênticos com pontos diferentes são considerados idênticos.</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\"><span class=\"pre\">is_authenticated</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.is_authenticated\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Atributo somente de leitura que está sempre definido como <code class=\"docutils literal notranslate\"><span class=\"pre\">True``(oposto</span> <span class=\"pre\">ao</span> <span class=\"pre\">`AnonymousUser.is_authenticated</span></code>  que é sempre <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>). Esta á a maneira de dizer se o usuário foi atenticado. Isso não implica em verificação de nenhuma permissão e não verifica se o usuário é ativo ou tem uma sessão válida. Mesmo que normalmente você irá verificar este atributo no <code class=\"docutils literal notranslate\"><span class=\"pre\">request.user</span></code> para descobrir se foi populado pelo <a class=\"reference internal\" href=\"/pt-br/6.0/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AuthenticationMiddleware</span></code></a> (representando o usuário logado atualmente), você deve saber se este atributo é <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> para qualquer instância de <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a>.</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\"><span class=\"pre\">is_anonymous</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.is_anonymous\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Atributo somente de leitura o qual é sempre definido como <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Esta é a maneira de diferenciar objetos do tipo <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a> e <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">AnonymousUser</span></code></a>. Geralmente, você deve preferir usar o <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">is_authenticated</span></code></a> a este atributo.</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\"><span class=\"pre\">set_password</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">raw_password</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.set_password\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Define a senha do usuário para uma dada string simples, levando em conta a criptografia da senha. Não salva o objeto <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\"><span class=\"pre\">AbstractBaseUser</span></code></a>.</p>\n<p>When the raw_password is <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></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\"><span class=\"pre\">set_unusable_password()</span></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\"><span class=\"pre\">check_password</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">raw_password</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.check_password\"><span class=\"visually-hidden\">Link para esta definição</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\"><span class=\"pre\">acheck_password</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">raw_password</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractBaseUser.acheck_password\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>Asynchronous version</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">acheck_password()</span></code></p>\n<p>Retorna <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>True``se a string simples é a senha correta para o usuário. (leva em conta a criptografia da senha quando fizer a comparação.)</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\"><span class=\"pre\">set_unusable_password</span></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 para esta definição</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\"><span class=\"pre\">check_password()</span></code></a> for\nthis user will never return <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></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\"><span class=\"pre\">AbstractBaseUser</span></code></a> object.</p>\n<p>Você talvez precise disso se a autenticação para sua aplicação é feita em uma fonte externa existente como um diretório 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\"><span class=\"pre\">has_usable_password</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></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\"><span class=\"pre\">set_unusable_password()</span></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\"><span class=\"pre\">get_session_auth_hash</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Retorna um HMAC do campo senha. Usado para “<a class=\"reference internal\" href=\"/pt-br/6.0/topics/auth/default/#session-invalidation-on-password-change\"><span class=\"std std-ref\">Invalidação de Sessão após a Troca de Senha.</span></a>” isto é, invalidar sessão no caso de alteração de password.</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\"><span class=\"pre\">get_session_auth_fallback_hash</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Yields the HMAC of the password field using\n<a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-SECRET_KEY_FALLBACKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY_FALLBACKS</span></code></a>. Used by <code class=\"docutils literal notranslate\"><span class=\"pre\">get_user()</span></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\"><span class=\"pre\">AbstractUser</span></code></a> subclasses <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\"><span class=\"pre\">AbstractBaseUser</span></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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">AbstractUser</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.AbstractUser\"><span class=\"visually-hidden\">Link para esta definição</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\"><span class=\"pre\">clean</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Normalizes the email by calling\n<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\"><span class=\"pre\">BaseUserManager.normalize_email()</span></code></a>. If you override this method,\nbe sure to call <code class=\"docutils literal notranslate\"><span class=\"pre\">super()</span></code> to retain the normalization.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"writing-a-manager-for-a-custom-user-model\">\n<h3>Escrevendo um manager para um modelo de usuário customizado<a class=\"heading-anchor\" href=\"#writing-a-manager-for-a-custom-user-model\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You should also define a custom manager for your user model. If your user model\ndefines <code class=\"docutils literal notranslate\"><span class=\"pre\">username</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">email</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">is_staff</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">is_superuser</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">last_login</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">date_joined</span></code> fields the same as Django’s default user,\nyou can install Django’s <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">UserManager</span></code></a>;\nhowever, if your user model defines different fields, you’ll need to define a\ncustom manager that extends\n<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\"><span class=\"pre\">BaseUserManager</span></code></a> providing two additional\nmethods:</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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">CustomUserManager</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUserManager\"><span class=\"visually-hidden\">Link para esta definição</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\"><span class=\"pre\">create_user</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">username_field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">password</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">other_fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUserManager.create_user\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>O protótipo de <code class=\"docutils literal notranslate\"><span class=\"pre\">create_user()``deve</span> <span class=\"pre\">aceitar</span> <span class=\"pre\">o</span> <span class=\"pre\">campo</span> <span class=\"pre\">&quot;username&quot;</span> <span class=\"pre\">,</span> <span class=\"pre\">mais</span> <span class=\"pre\">todos</span> <span class=\"pre\">os</span> <span class=\"pre\">campos</span> <span class=\"pre\">requeridos</span> <span class=\"pre\">como</span> <span class=\"pre\">argumentos.</span> <span class=\"pre\">Por</span> <span class=\"pre\">exemlo,</span> <span class=\"pre\">se</span> <span class=\"pre\">seu</span> <span class=\"pre\">modelo</span> <span class=\"pre\">de</span> <span class=\"pre\">usuário</span> <span class=\"pre\">usa</span> <span class=\"pre\">``email</span></code> como o campo username, e tem <code class=\"docutils literal notranslate\"><span class=\"pre\">date_of_birth</span></code> como campo requerido, então <code class=\"docutils literal notranslate\"><span class=\"pre\">create_user</span></code> deve ser definido como:</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=\"w\"> </span><span class=\"nf\">create_user</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">email</span><span class=\"p\">,</span> <span class=\"n\">date_of_birth</span><span class=\"p\">,</span> <span class=\"n\">password</span><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\"><span class=\"pre\">create_superuser</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">username_field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">password</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">other_fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.CustomUserManager.create_superuser\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>O protótipo de <code class=\"docutils literal notranslate\"><span class=\"pre\">create_superuser()``deve</span> <span class=\"pre\">aceitar</span> <span class=\"pre\">o</span> <span class=\"pre\">campo</span> <span class=\"pre\">&quot;username&quot;</span> <span class=\"pre\">,</span> <span class=\"pre\">mais</span> <span class=\"pre\">todos</span> <span class=\"pre\">os</span> <span class=\"pre\">campos</span> <span class=\"pre\">requeridos</span> <span class=\"pre\">como</span> <span class=\"pre\">argumentos.</span> <span class=\"pre\">Por</span> <span class=\"pre\">exemlo,</span> <span class=\"pre\">se</span> <span class=\"pre\">seu</span> <span class=\"pre\">modelo</span> <span class=\"pre\">de</span> <span class=\"pre\">usuário</span> <span class=\"pre\">usa</span> <span class=\"pre\">``email</span></code> como o campo “username”, e tem <code class=\"docutils literal notranslate\"><span class=\"pre\">date_of_birth</span></code> como campo requerido, então <code class=\"docutils literal notranslate\"><span class=\"pre\">create_user</span></code> deve ser definido como:</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=\"w\"> </span><span class=\"nf\">create_superuser</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">email</span><span class=\"p\">,</span> <span class=\"n\">date_of_birth</span><span class=\"p\">,</span> <span class=\"n\">password</span><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>For a <a class=\"reference internal\" href=\"/pt-br/6.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> in <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\"><span class=\"pre\">USERNAME_FIELD</span></code></a> or\n<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\"><span class=\"pre\">REQUIRED_FIELDS</span></code></a>, these methods receive the value of the\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">to_field</span></code></a> (the <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">primary_key</span></code></a>\nby default) of an existing instance.</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\"><span class=\"pre\">BaseUserManager</span></code></a> fornece os seguintes métodos de utilidade:</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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">BaseUserManager</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.BaseUserManager\"><span class=\"visually-hidden\">Link para esta definição</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\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">normalize_email</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">email</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.BaseUserManager.normalize_email\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Normaliza o endereço de email colocando em minúsculas a porção do domínio do endereço de email.</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\"><span class=\"pre\">get_by_natural_key</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">username</span></span></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 para esta definição</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\"><span class=\"pre\">aget_by_natural_key</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">username</span></span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>Asynchronous version</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aget_by_natural_key()</span></code></p>\n<p>Retornar uma instância de usuário usando o conteúdo do campo denominado no <code class=\"docutils literal notranslate\"><span class=\"pre\">USERNAME_FIELD</span></code>.</p>\n<aside class=\"version-note version-changed\" data-version=\"5.2\">\n<p class=\"version-note-title\">Changed in Django 5.2</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">aget_by_natural_key()</span></code> method was added.</p>\n</aside>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"extending-django-s-default-user\">\n<h3>Estendendo o <code class=\"docutils literal notranslate\"><span class=\"pre\">Usuário</span></code> padrão do Django<a class=\"heading-anchor\" href=\"#extending-django-s-default-user\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If you’re entirely happy with Django’s\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a> model, but you want to add some\nadditional profile information, you could subclass\n<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\"><span class=\"pre\">django.contrib.auth.models.AbstractUser</span></code></a> and add your custom profile\nfields, although we’d recommend a separate model as described in\n<a class=\"reference internal\" href=\"#specifying-custom-user-model\"><span class=\"std std-ref\">Definindo um modelo de usuário personalizado.</span></a>. <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractUser</span></code> provides the full\nimplementation of the default <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a> as an\n<a class=\"reference internal\" href=\"/pt-br/6.0/topics/db/models/#abstract-base-classes\"><span class=\"std std-ref\">abstract model</span></a>.</p>\n</section>\n<section id=\"custom-users-and-the-built-in-auth-forms\">\n<span id=\"id2\"></span><h3>Usuários personalizados e o formulários de autenticação embutidos.<a class=\"heading-anchor\" href=\"#custom-users-and-the-built-in-auth-forms\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Os <a class=\"reference internal\" href=\"/pt-br/6.0/topics/auth/default/#built-in-auth-forms\"><span class=\"std std-ref\">forms</span></a> e <a class=\"reference internal\" href=\"/pt-br/6.0/topics/auth/default/#built-in-auth-views\"><span class=\"std std-ref\">views</span></a> embutidos no Django tem certas premissas sobre o modelo de usuário que eles estão trabalhando.</p>\n<p>Os “forms” seguintes são compatíveis com qualquer subclasse de <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\"><span class=\"pre\">AbstractBaseUser</span></code></a>:</p>\n<ul class=\"simple\">\n<li><p>A <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">AuthenticationForm</span></code></a>: usa o campo username especificado pelo <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\"><span class=\"pre\">USERNAME_FIELD</span></code></a>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">SetPasswordForm</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">PasswordChangeForm</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">AdminPasswordChangeForm</span></code></a></p></li>\n</ul>\n<p>Os seguintes forms fazem suposições quanto ao modelo de usuário e podem ser usadas tal como estão se estas suposições forem válidas:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">PasswordResetForm</span></code></a>: Assumes that the user\nmodel has a field that stores the user’s email address with the name returned\nby <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\"><span class=\"pre\">get_email_field_name()</span></code></a> (<code class=\"docutils literal notranslate\"><span class=\"pre\">email</span></code> by\ndefault) that can be used to identify the user and a boolean field named\n<code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> to prevent password resets for inactive users.</p></li>\n</ul>\n<p>Finalmente, os seguintes forms estão amarrados a <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a> e precisa ser rescrito ou estendido para funcionar com o modelo de usuário personalizado:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">UserCreationForm</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">UserChangeForm</span></code></a></p></li>\n</ul>\n<p>If your custom user model is a subclass of <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractUser</span></code>, then you can\nextend these forms in this manner:</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=\"w\"> </span><span class=\"nn\">django.contrib.auth.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UserCreationForm</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CustomUser</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomUserCreationForm</span><span class=\"p\">(</span><span class=\"n\">UserCreationForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">(</span><span class=\"n\">UserCreationForm</span><span class=\"o\">.</span><span class=\"n\">Meta</span><span class=\"p\">):</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CustomUser</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"n\">UserCreationForm</span><span class=\"o\">.</span><span class=\"n\">Meta</span><span class=\"o\">.</span><span class=\"n\">fields</span> <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>Usuários personalizados e <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">django.contrib.admin</span></code></a><a class=\"heading-anchor\" href=\"#custom-users-and-django-contrib-admin\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Se você quer que seu modelo de usuário personalizado também funcione com o “admin”, seu modelo de usuário deve definir alguns atributos e métodos adicionais. Estes métodos permitem que o “admin” controle o acesso do usuário ao conteúdo do “admin”.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">CustomUser</span></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\"><span class=\"pre\">is_staff</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.is_staff\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Retorna <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>True``se o usuário está permitido a ter acesso ao site admin.</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\"><span class=\"pre\">is_active</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.is_active\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Retorna <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> se a conta de usuário estiver ativa.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\">\n<span class=\"sig-name descname\"><span class=\"pre\">has_perm(perm,</span> <span class=\"pre\">obj=None):</span></span></dt>\n<dd><p>Retorna <code class=\"docutils literal notranslate\"><span class=\"pre\">True``se</span> <span class=\"pre\">o</span> <span class=\"pre\">usuário</span> <span class=\"pre\">tem</span> <span class=\"pre\">a</span> <span class=\"pre\">permissão</span> <span class=\"pre\">nominada.</span> <span class=\"pre\">Se</span> <span class=\"pre\">``obj</span></code> é fornecido, a permissão necessária para ser verificado para uma instância de objeto específica.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\">\n<span class=\"sig-name descname\"><span class=\"pre\">has_module_perms(app_label):</span></span></dt>\n<dd><p>Retorna <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>True``se o usuário tem permissão para acessar modelos na dada aplicação.</p>\n</dd></dl>\n\n<p>Você também irá precisar registrar seu modelo de usuário personalizado com o “admin”. Se seu modelo ersonalizado herda de <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.models.AbstractUser</span></code>, você pode usar a classe já existente <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.admin.UserAdmin</span></code>. Porém, se seu modelo de usuário herda de <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\"><span class=\"pre\">AbstractBaseUser</span></code></a>, você precisa definir uma classe personalizada de <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code>. Pode ser que seja possível herdar da <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.admin.UserAdmin</span></code> padrão; porém, será necessário sobrescrever qualquer das definições que se referem a campos do <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>django.contrib.auth.models.AbstractUser``e que não estejam no sua classe de usuário personalizado.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>If you are using a custom <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code> which is a subclass of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.admin.UserAdmin</span></code>, then you need to add your custom\nfields to <code class=\"docutils literal notranslate\"><span class=\"pre\">fieldsets</span></code> (for fields to be used in editing users) and to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">add_fieldsets</span></code> (for fields to be used when creating a user). For\nexample:</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=\"w\"> </span><span class=\"nn\">django.contrib.auth.admin</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UserAdmin</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomUserAdmin</span><span class=\"p\">(</span><span class=\"n\">UserAdmin</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"n\">fieldsets</span> <span class=\"o\">=</span> <span class=\"n\">UserAdmin</span><span class=\"o\">.</span><span class=\"n\">fieldsets</span> <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    <span class=\"n\">add_fieldsets</span> <span class=\"o\">=</span> <span class=\"n\">UserAdmin</span><span class=\"o\">.</span><span class=\"n\">add_fieldsets</span> <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>See <a class=\"reference internal\" href=\"#custom-users-admin-full-example\"><span class=\"std std-ref\">a full example</span></a> for more\ndetails.</p>\n</aside>\n</section>\n<section id=\"custom-users-and-permissions\">\n<h3>Usuários personalizados e permissões<a class=\"heading-anchor\" href=\"#custom-users-and-permissions\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Para tornar fácil a inclusão do mecanismo de permissão do Django na sua classe de usuário, o Django fornece a <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\"><span class=\"pre\">PermissionsMixin</span></code></a>. Ela é uma classe de modelo abstrato que você pode incluir na hierarquia de classes do seu modelo, lhe dando todos os métodos e campos do banco  de dados necessários de modo a funcionar como modelo de permissão do 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\"><span class=\"pre\">PermissionsMixin</span></code></a> fornece os seguintes métodos e atributos:</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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">PermissionsMixin</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin\"><span class=\"visually-hidden\">Link para esta definição</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\"><span class=\"pre\">is_superuser</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.is_superuser\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Booleano. Designa que este user tem todas as permissões sem assinalá-las explicitamente.</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\"><span class=\"pre\">get_user_permissions</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">obj</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns a set of permission strings that the user has directly.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> is passed in, only returns the user permissions for this\nspecific object.</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\"><span class=\"pre\">get_group_permissions</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">obj</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Retorna um conjunto de strings de permissões  que o usuário tem através de seus grupos.</p>\n<p>Se o <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> é passado, somente retorna o grupo de permissões para este objeto específico.</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\"><span class=\"pre\">get_all_permissions</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">obj</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Retorna um conjunto de strings de permissões que o usuário tem, através de ambos permissões de grupo e usuário.</p>\n<p>Se o <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> é passado, somente retorna as permissões para este objeto específico.</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\"><span class=\"pre\">has_perm</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">perm</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">obj</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.has_perm\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if the user has the specified permission, where\n<code class=\"docutils literal notranslate\"><span class=\"pre\">perm</span></code> is in the format <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;&lt;app</span> <span class=\"pre\">label&gt;.&lt;permission</span> <span class=\"pre\">codename&gt;&quot;</span></code> (see\n<a class=\"reference internal\" href=\"/pt-br/6.0/topics/auth/default/#topic-authorization\"><span class=\"std std-ref\">permissions</span></a>). If <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User.is_active</span></code></a>\nand <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">is_superuser</span></code></a> are both <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, this method always\nreturns <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<p>Se <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> é passado, este método não irá verificar por permissões para o modelo, mas para este objeto específico.</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\"><span class=\"pre\">has_perms</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">perm_list</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">obj</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.has_perms\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if the user has each of the specified permissions,\nwhere each perm is in the format\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;&lt;app</span> <span class=\"pre\">label&gt;.&lt;permission</span> <span class=\"pre\">codename&gt;&quot;</span></code>. If <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User.is_active</span></code></a> and\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">is_superuser</span></code></a> are both <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, this method always\nreturns <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<p>Se <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> é passado, este método não irá verificar por permissões para o modelo, mas para este objeto específico.</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\"><span class=\"pre\">has_module_perms</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">package_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.PermissionsMixin.has_module_perms\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if the user has any permissions in the given package\n(the Django app label). If <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User.is_active</span></code></a> and\n<a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">is_superuser</span></code></a> are both <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, this method always\nreturns <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n</dd></dl>\n\n</dd></dl>\n\n<aside class=\"admonition-permissionsmixin-and-modelbackend admonition\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\"><span class=\"pre\">PermissionsMixin</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code></p>\n<p>Caso não inclua a <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\"><span class=\"pre\">PermissionsMixin</span></code></a>, você deve se assegurar que os métodos de permissões não sejam chamados no <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>. O <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code> assume que determinados campos estão disponíveis no seu modelo. Se o seu modelo de usuário não provê estes campos, você irá receber erros de banco de dados quando as permissões forem verificadas.</p>\n</aside>\n</section>\n<section id=\"custom-users-and-proxy-models\">\n<h3>Usuários personalizados e modelos de proxy<a class=\"heading-anchor\" href=\"#custom-users-and-proxy-models\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Uma das limitações de modelos de usuário personalizados é que ao instalar uma classe de modelo de usuário personalizado qualquer modelo “proxy” que estenda a <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a> irá quebrar. Modelos do tipo “proxy” devem ser baseados em uma classe base concreta; ao definir um modelo de usuário personalizado, você está removendo a habilidade do Django de identificar a classe base de maneira confiável.</p>\n<p>Se seu projeto usa modelos “proxy”, você deve modificar o “proxy” para herdar do modelo de usuário em uso no seu projeto, ou juntar o comportamento do seu “proxy” dentro da sua subclasse de <a class=\"reference internal\" href=\"/pt-br/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\"><span class=\"pre\">User</span></code></a>.</p>\n</section>\n<section id=\"a-full-example\">\n<span id=\"custom-users-admin-full-example\"></span><h3>Um exemplo completo<a class=\"heading-anchor\" href=\"#a-full-example\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Here is an example of an admin-compliant custom user app. This user model uses\nan email address as the username, and has a required date of birth; it\nprovides no permission checking beyond an <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> flag on the user account.\nThis model would be compatible with all the built-in auth forms and views,\nexcept for the user creation forms. This example illustrates how most of the\ncomponents work together, but is not intended to be copied directly into\nprojects for production use.</p>\n<p>Todo este código deve estar no arquivo “models.py” para um aplicativo de autenticação customizável:</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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseUserManager</span><span class=\"p\">,</span> <span class=\"n\">AbstractBaseUser</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyUserManager</span><span class=\"p\">(</span><span class=\"n\">BaseUserManager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">create_user</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">email</span><span class=\"p\">,</span> <span class=\"n\">date_of_birth</span><span class=\"p\">,</span> <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><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> <span class=\"n\">email</span><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        <span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">(</span>\n            <span class=\"n\">email</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">normalize_email</span><span class=\"p\">(</span><span class=\"n\">email</span><span class=\"p\">),</span>\n            <span class=\"n\">date_of_birth</span><span class=\"o\">=</span><span class=\"n\">date_of_birth</span><span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n\n        <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">set_password</span><span class=\"p\">(</span><span class=\"n\">password</span><span class=\"p\">)</span>\n        <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_db</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">user</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">create_superuser</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">email</span><span class=\"p\">,</span> <span class=\"n\">date_of_birth</span><span class=\"p\">,</span> <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><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        <span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">create_user</span><span class=\"p\">(</span>\n            <span class=\"n\">email</span><span class=\"p\">,</span>\n            <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"n\">password</span><span class=\"p\">,</span>\n            <span class=\"n\">date_of_birth</span><span class=\"o\">=</span><span class=\"n\">date_of_birth</span><span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n        <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_admin</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n        <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_db</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">user</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyUser</span><span class=\"p\">(</span><span class=\"n\">AbstractBaseUser</span><span class=\"p\">):</span>\n    <span class=\"n\">email</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">EmailField</span><span class=\"p\">(</span>\n        <span class=\"n\">verbose_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;email address&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">,</span>\n        <span class=\"n\">unique</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">date_of_birth</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">is_active</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">BooleanField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">is_admin</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">BooleanField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">MyUserManager</span><span class=\"p\">()</span>\n\n    <span class=\"n\">USERNAME_FIELD</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;email&quot;</span>\n    <span class=\"n\">REQUIRED_FIELDS</span> <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=\"w\"> </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><span class=\"n\">email</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">has_perm</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">perm</span><span class=\"p\">,</span> <span class=\"n\">obj</span><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=\"w\"> </span><span class=\"nf\">has_module_perms</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><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=\"w\"> </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><span class=\"n\">is_admin</span>\n</code></pre></div>\n<p>Then, to register this custom user model with Django’s admin, the following\ncode would be required in the app’s <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> file:</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=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Group</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.admin</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UserAdmin</span> <span class=\"k\">as</span> <span class=\"n\">BaseUserAdmin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ReadOnlyPasswordHashField</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ValidationError</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">customauth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">MyUser</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">UserCreationForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><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    <span class=\"n\">password1</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">label</span><span class=\"o\">=</span><span class=\"s2\">&quot;Password&quot;</span><span class=\"p\">,</span> <span class=\"n\">widget</span><span class=\"o\">=</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">PasswordInput</span><span class=\"p\">)</span>\n    <span class=\"n\">password2</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span>\n        <span class=\"n\">label</span><span class=\"o\">=</span><span class=\"s2\">&quot;Password confirmation&quot;</span><span class=\"p\">,</span> <span class=\"n\">widget</span><span class=\"o\">=</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">PasswordInput</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">MyUser</span>\n        <span class=\"n\">fields</span> <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=\"w\"> </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        <span class=\"n\">password1</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;password1&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">password2</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;password2&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">password1</span> <span class=\"ow\">and</span> <span class=\"n\">password2</span> <span class=\"ow\">and</span> <span class=\"n\">password1</span> <span class=\"o\">!=</span> <span class=\"n\">password2</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><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> <span class=\"n\">password2</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">save</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">commit</span><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        <span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">commit</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n        <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">set_password</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"p\">[</span><span class=\"s2\">&quot;password1&quot;</span><span class=\"p\">])</span>\n        <span class=\"k\">if</span> <span class=\"n\">commit</span><span class=\"p\">:</span>\n            <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"n\">user</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">UserChangeForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><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    <span class=\"n\">password</span> <span class=\"o\">=</span> <span class=\"n\">ReadOnlyPasswordHashField</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">MyUser</span>\n        <span class=\"n\">fields</span> <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=\"w\"> </span><span class=\"nc\">UserAdmin</span><span class=\"p\">(</span><span class=\"n\">BaseUserAdmin</span><span class=\"p\">):</span>\n    <span class=\"c1\"># The forms to add and change user instances</span>\n    <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">UserChangeForm</span>\n    <span class=\"n\">add_form</span> <span class=\"o\">=</span> <span class=\"n\">UserCreationForm</span>\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    <span class=\"n\">list_display</span> <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    <span class=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;is_admin&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">fieldsets</span> <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    <span class=\"n\">add_fieldsets</span> <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    <span class=\"n\">search_fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">filter_horizontal</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n\n<span class=\"c1\"># Now register the new UserAdmin...</span>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">MyUser</span><span class=\"p\">,</span> <span class=\"n\">UserAdmin</span><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>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">unregister</span><span class=\"p\">(</span><span class=\"n\">Group</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Finalmente, especifique o model customizado como sendo o “user model” padrão para o seu projeto, utilizando para isso, <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a>  no arquivo “settings.py”:</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=\"n\">AUTH_USER_MODEL</span> <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>Adding an async interface<a class=\"heading-anchor\" href=\"#adding-an-async-interface\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-added\" data-version=\"5.2\">\n<p class=\"version-note-title\">New in Django 5.2</p></aside>\n<p>To optimize performance when called from an async context authentication,\nbackends can implement async versions of each function - <code class=\"docutils literal notranslate\"><span class=\"pre\">aget_user(user_id)</span></code>\nand <code class=\"docutils literal notranslate\"><span class=\"pre\">aauthenticate(request,</span> <span class=\"pre\">**credentials)</span></code>. When an authentication backend\nextends <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseBackend</span></code> and async versions of these functions are not provided,\nthey will be automatically synthesized with <code class=\"docutils literal notranslate\"><span class=\"pre\">sync_to_async</span></code>. This has\n<a class=\"reference internal\" href=\"/pt-br/6.0/topics/async/#async-performance\"><span class=\"std std-ref\">performance penalties</span></a>.</p>\n<p>While an async interface is optional, a synchronous interface is always\nrequired. There is no automatic synthesis for a synchronous interface if an\nasync interface is implemented.</p>\n<p>Django’s out-of-the-box authentication backends have native async support. If\nthese native backends are extended take special care to make sure the async\nversions of modified functions are modified as well.</p>\n</section>\n</section>\n</section>","rootId":"customizing-authentication-in-django","toc":[{"title":"Outras fontes de autenticação","anchor":"other-authentication-sources","children":[{"title":"Especificando backends de autenticação","anchor":"specifying-authentication-backends","children":[]},{"title":"Desenvolvendo um backend de autenticação","anchor":"writing-an-authentication-backend","children":[]},{"title":"Lidando com autorização em bakends personalizados","anchor":"handling-authorization-in-custom-backends","children":[{"title":"Autorização para usuários anônimos","anchor":"authorization-for-anonymous-users","children":[]},{"title":"Autorização para usuários inativos","anchor":"authorization-for-inactive-users","children":[]},{"title":"Manipulação de permissões de objeto","anchor":"handling-object-permissions","children":[]}]}]},{"title":"Permissões personalizadas","anchor":"custom-permissions","children":[]},{"title":"Estendendo o modelo Usuário existente","anchor":"extending-the-existing-user-model","children":[]},{"title":"Substituindo um modelo de Usuário personalizado","anchor":"substituting-a-custom-user-model","children":[{"title":"Usando um modelo de usuário personalizado quando iniciando um projeto","anchor":"using-a-custom-user-model-when-starting-a-project","children":[]},{"title":"Mudando para um modelo “user” personalizado no meio do projeto","anchor":"changing-to-a-custom-user-model-mid-project","children":[]},{"title":"Apps reusáveis e AUTH_USER_MODEL","anchor":"reusable-apps-and-auth-user-model","children":[]},{"title":"Referenciando o modelo Usuário","anchor":"referencing-the-user-model","children":[]},{"title":"Definindo um modelo de usuário personalizado.","anchor":"specifying-a-custom-user-model","children":[]},{"title":"Escrevendo um manager para um modelo de usuário customizado","anchor":"writing-a-manager-for-a-custom-user-model","children":[]},{"title":"Estendendo o Usuário padrão do Django","anchor":"extending-django-s-default-user","children":[]},{"title":"Usuários personalizados e o formulários de autenticação embutidos.","anchor":"custom-users-and-the-built-in-auth-forms","children":[]},{"title":"Usuários personalizados e django.contrib.admin","anchor":"custom-users-and-django-contrib-admin","children":[]},{"title":"Usuários personalizados e permissões","anchor":"custom-users-and-permissions","children":[]},{"title":"Usuários personalizados e modelos de proxy","anchor":"custom-users-and-proxy-models","children":[]},{"title":"Um exemplo completo","anchor":"a-full-example","children":[{"title":"Adding an async interface","anchor":"adding-an-async-interface","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Usando o Django","url":"/pt-br/6.0/topics/"},{"docname":"topics/auth/index","title":"Autenticação de usuário no Django","url":"/pt-br/6.0/topics/auth/"}],"prev":{"docname":"topics/auth/passwords","title":"Gerenciamento de senhas no Django","url":"/pt-br/6.0/topics/auth/passwords/"},"next":{"docname":"topics/cache","title":"O framework de “cache” do Django","url":"/pt-br/6.0/topics/cache/"},"formats":{"html":"/pt-br/6.0/topics/auth/customizing/","markdown":"/pt-br/6.0/topics/auth/customizing.md","json":"/pt-br/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/pt-br/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"]}