{"title":"Personalizando a autenticação no Django","version":"1.9","locale":"pt-br","docname":"topics/auth/customizing","url":"/pt-br/1.9/topics/auth/customizing/","canonical":"https://djangodocs.dev/pt-br/1.9/topics/auth/customizing/","summary":"A autenticação que vem com o Django é boa o suficiente pros casos mais comuns, mas você pode ter necessidades que não atendem os padrões fora-da-caixa. Para…","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 pros casos mais comuns, mas você pode ter necessidades que não atendem os padrões fora-da-caixa. Para customizar a autenticação de forma a atender as necessidades do seu projeto, é preciso entender quais pontos do sistema fornecido são extensíveis ou substituíveis. Esse documento fornece detalhes sobre como o sistema de autenticação pode ser customizado.</p>\n<p><a class=\"reference internal\" href=\"#authentication-backends\"><span class=\"std std-ref\">Autenticação backend</span></a> provê um sistema extensível para quando o username ou senha armazenado no User model precisar ser autenticado em um diferente serviço que o Django tem por padrão.</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 User model padrão, ou <a class=\"reference internal\" href=\"#auth-custom-user\"><span class=\"std std-ref\">substituir</span></a> por um model completamente customizado.</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/1.9/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>Por de trás dos panos, Django mantém uma lista de “backends de autenticação” que ele verifica para autenticação. Quando alguém chama: func:django.contrib.auth.authenticate() – como descrito em <a class=\"reference internal\" href=\"/pt-br/1.9/topics/auth/default/#how-to-log-a-user-in\"><span class=\"std std-ref\">Como logar um usuário</span></a> – Django tenta autenticar através de todas os backends de autenticações. Se o primeiro método falhar, Django tenta o segundo, e assim por diante, até todos os backends terem sido tentados.</p>\n<p>A lista de backends autenticação usada é especificada na definição <a class=\"reference internal\" href=\"/pt-br/1.9/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=\"s1\">&#39;django.contrib.auth.backends.ModelBackend&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Esta é o “backend” de autenticação básico que verifica o banco de dados de usuários Django e consulta as suas permissões embutidas. Ele não provê proteção contra ataques de força bruta via qualquer mecanismo limitante. Você pode implementar seu próprio mecanismo com taxa de limitação em um “backend” customizado de autenticação, ou usar o mecanismo fornecido pela maioria dos servidores Web.</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/1.9/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>Uma vez que um usuário esteja autenticado, Django armazena qual o “backend” foi usado para autenticar aquele usuário na sessão do usuário, e re-usa o mesmo backend pela duração da sessão sempre que o acesso ao usuário autenticado atualmente for necessário. Isto efetivamente significa que as fontes de autenticação são cacheadas baseada por sessão, então se você mudar :setting`AUTHENTICATION_BACKENDS`, você irá precisar limpar os dados da sessão se você precisar forçar o usuário a re-autenticar usando diferentes métodos. Uma maneira simples de fazer isto é executar <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 2 métodos obrigatórios:  <code class=\"docutils literal notranslate\"><span class=\"pre\">get_user(user_id)</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">authenticate(**credentials)</span></code>, também um conjunto de permissões opcionais relacionadas <a class=\"reference internal\" href=\"#authorization-methods\"><span class=\"std std-ref\">métodos de autorização</span></a>.</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 nome de usuário, id do banco de dados, tanto faz, mas tem que ser a chave-primária do seu objeto <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> – e retorna um objeto <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code>.</p>\n<p>O <code class=\"docutils literal notranslate\"><span class=\"pre\">método</span></code> recebe credenciais como argumentos nomeados. Na maioria das vezes, isso deve parecer com isso:</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\">MyBackend</span><span class=\"p\">(</span><span class=\"nb\">object</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\">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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyBackend</span><span class=\"p\">(</span><span class=\"nb\">object</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\">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>de qualquer maneira, o <code class=\"docutils literal notranslate\"><span class=\"pre\">authenticate</span></code> deve verificar as credenciais que recebe, e deve retornar um objeto <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> que combine com as credenciais, se as credenciais forem válidas. Se elas não são válidas, ele deve retornar <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>.</p>\n<p>O Django admin está bem casado com o <a class=\"reference internal\" href=\"/pt-br/1.9/topics/auth/default/#user-objects\"><span class=\"std std-ref\">objeto User</span></a> do Django. A melhor maneira de lidar com isso é criar um objeto <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> do Django para cada usuário que existir para seu “backend” (por ex.:, no seu diretório LDAP, seu banco de dados SQL externo e etc) Você pode inclusive escrever um script para fazer isso de ante-mão, ou seu método de autenticação pode fazê-lo na primeira vez que o usuário se logar.</p>\n<p>Aqui um exemplo de “backend” que autentica com um nome de usuário e senha variáveis definidas no seu arquivo <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> e cria um <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> Django na primeira vez que um usuário se autentique:</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.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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SettingsBackend</span><span class=\"p\">(</span><span class=\"nb\">object</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\">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=\"p\">(</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><span class=\"p\">)</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. Note that we can set password</span>\n                <span class=\"c1\"># to anything, because it won&#39;t be checked; the password</span>\n                <span class=\"c1\"># from settings.py will.</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=\"n\">password</span><span class=\"o\">=</span><span class=\"s1\">&#39;get from settings.py&#39;</span><span class=\"p\">)</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>O modelo de usuário irá delegar funções “lookup” de permissões (<a class=\"reference internal\" href=\"/pt-br/1.9/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>, <a class=\"reference internal\" href=\"/pt-br/1.9/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>, <a class=\"reference internal\" href=\"/pt-br/1.9/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>, and <a class=\"reference internal\" href=\"/pt-br/1.9/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>) para qualquer “backend” de autenticação que implemente essas funções.</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 concederia.</p>\n<aside class=\"version-note version-added\" data-version=\"1.8\">\n<p class=\"version-note-title\">New in Django 1.8</p><p>Se um “backend” emiti uma exceção <a class=\"reference internal\" href=\"/pt-br/1.9/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> no <a class=\"reference internal\" href=\"/pt-br/1.9/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> ou <a class=\"reference internal\" href=\"/pt-br/1.9/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>, a autorizaçõ irá falhar imediatamente e o Django não irá verificar os próximos “backends”.</p>\n</aside>\n<p>O “backend” simples acima poderia implementar permissões para o mágico admin de maneira relativamente simples.</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\">SettingsBackend</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n    <span class=\"o\">...</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\">if</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><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">False</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>Uma implementação completa de autorização pode ser encontrada na classe <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code> no <a class=\"reference external\" href=\"https://github.com/django/django/blob/master/django/contrib/auth/backends.py\">django/contrib/auth/backends.py</a>, o qual é o “backend” padrão e consulta a tabela <code class=\"docutils literal notranslate\"><span class=\"pre\">auth_permission</span></code> na maior parte do tempo. Se você quer fornecer um comportamento personalizado para somente parte da API do “backend”, você pode tirar vantagem da herança Python e criar uma subclasse de <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code> ao invés de de implmentar a API completa em um “backend” customizado.</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>O framework de permissão do Django não possui um local para armazenar permissões para usuários anônimos. Porém, o objeto usuário passado para um “backend” de autenticação pode ser um objeto <a class=\"reference internal\" href=\"/pt-br/1.9/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>, permitindo o “backend” a especificar um comportamento de autorização personalizado para usuários anônimos. Isso é especialmente útil para autores de “apps” reutilizáveis, que podem delegar todas as questões de autorização para o “backend” de autorização, ao invés de demandar configurações, por exemplo, controlar acesso de anônimos.</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 usuário inativo é um que está autenticado mas tem seu atributo  <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> definido como <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Todavia isso não quer dizer que ele não está autorizado a não fazer nada. Por exemplo eles estão permitidos a ativar suas contas.</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/1.9/topics/db/models/#meta-options\"><span class=\"std std-ref\">model Meta attribute</span></a>.</p>\n<p>Este modelos “Task” de exemplo cria três permissões personalizadas, isto é, ações que usuários podem ou não podem fazer com instâncias de “Tasks”, específicas para sua aplicação:</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    <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;view_task&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Can see available tasks&quot;</span><span class=\"p\">),</span>\n            <span class=\"p\">(</span><span class=\"s2\">&quot;change_task_status&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Can change the status of tasks&quot;</span><span class=\"p\">),</span>\n            <span class=\"p\">(</span><span class=\"s2\">&quot;close_task&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Can remove a task by setting its status as closed&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">)</span>\n</code></pre></div>\n<p>A única coisa que isso faz é criar aquelas permissões extras quando você roda <a class=\"reference internal\" href=\"/pt-br/1.9/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> ( a função que cria permissões está conectada com o sinal <a class=\"reference internal\" href=\"/pt-br/1.9/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>). Seu código está encarregado de verificar o valor destas permissões quando um usuário está tentando acessar a funcionalidade fornecida pela aplicação (ver tarefas, edita o status de tarefas, fechar tarefas). Continuando o exemplo acima, as seguintes verificam se um usuário pode ver “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=\"s1\">&#39;app.view_task&#39;</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/1.9/ref/contrib/auth/#id0\" 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/1.9/topics/db/models/#proxy-models\"><span class=\"std std-ref\">proxy model</span></a>  baseado na  <a class=\"reference internal\" href=\"/pt-br/1.9/ref/contrib/auth/#id0\" 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/1.9/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<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>Assumindo um “Employee” existente Fred Smith o qual tem ambos os modelos “User” e “Employee”, você pode acessar a informação relacionada usando a convenção de relação de modelo padrão do Django.</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=\"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=\"s1\">&#39;fsmith&#39;</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/1.9/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/1.9/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/1.9/ref/contrib/auth/#id0\" 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<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=\"s1\">&#39;employee&#39;</span>\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> <span class=\"p\">)</span>\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>Este modelo de perfil não é especial de nenhum modo - eles são somente modelos Django que tem uma relação de um-pra-um com o modelo User. Portanto, eles não são criados automaticamente quando um usuário é criado, mas um <a class=\"reference internal\" href=\"/pt-br/1.9/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 editar modelos relacionados quando apropriado.</p>\n<p>Note que usar modelos relacionados resultam em consultas ou “joins” adicionais para retornar os dados relacionados, e dependendo de suas necessidades substituindo o modelo User e adicionando os campos relacionados talvez seja uma opção melhor. Todavia conexões existentes para o modelo de usuário padrão dentro da aplicação do seu projeto talvez justifique a carga extra no 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/1.9/ref/contrib/auth/#id0\" 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 através da definição de um valor para <a class=\"reference internal\" href=\"/pt-br/1.9/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> que referencia 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=\"s1\">&#39;myapp.MyUser&#39;</span>\n</code></pre></div>\n<p>Este par pontuado descreve o nome da aplicação Django (o qual deve estar no seu <a class=\"reference internal\" href=\"/pt-br/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>), e o nome do modelo Django que você deseja usar como seu modelo de usuário.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Aviso</p>\n<p>Alterar o <a class=\"reference internal\" href=\"/pt-br/1.9/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>   tem um grande efeito na estrutura do seu banco de dados. Ele altera as tabelas que estao disponíveis, e isso irá afetar a construção de chaves-estrangeiras e as relações muitos-para-muitos. Se você tem intenção de definir <a class=\"reference internal\" href=\"/pt-br/1.9/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>, você deve defini-lo antes de criar qualquer migração ou antes de rodar <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code> pela primeira vez.</p>\n<p>Alterar esta definição depois de ter criado as tabelas não é suportado pelo <a class=\"reference internal\" href=\"/pt-br/1.9/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> e irá resultar em você ter que arrumar manualmente seu esquema, mover seus dados da tabela de usuário antiga, e possivelmente manualmente reaplicar algumas amigrações.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Aviso</p>\n<p>Devido a limitações da funcionalidade de dependência dinâmica do Django para substituir modelos, você de ter certeza que o modelo referenciado pelo <a class=\"reference internal\" href=\"/pt-br/1.9/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> é criado na primeira migraçao de sua aplicação  (geralmente chamada <code class=\"docutils literal notranslate\"><span class=\"pre\">0001_initial</span></code>); de outra maneira, você irá ter problemas com dependências.</p>\n<p>Além disso, você talvez caia em um “CircularDependencyError” quando rodar suaa migrações já que o Django não será capaz de quebrar o “loop” de dependência devido a dependência dinâmica. Se você vir este erro, você deverá quebrar o “loop” movendo os modelos dos quais seu modelo de usuário depende para uma segunda migração (você opode tentar fazer dois modelos normais que tem uma “ForeignKey” de um para ou outro e ver como <code class=\"docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code> resolve a dependência circular se você quiser ver como isso é feito geralmente).</p>\n</aside>\n<aside class=\"admonition-reusable-apps-and-auth-user-model admonition\">\n<p class=\"admonition-title\">Apps reusáveis e <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></p>\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/1.9/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/1.9/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</aside>\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ê referencia diretamente o <a class=\"reference internal\" href=\"/pt-br/1.9/ref/contrib/auth/#id0\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a>  (fpor exemplo, fazendo uma referencia através de uma chave estrangeira),  seu código não irá funcionar em projetos onde a definição do <a class=\"reference internal\" href=\"/pt-br/1.9/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 mudada para um modelo de “User” 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 referenciar diretamente a <a class=\"reference internal\" href=\"/pt-br/1.9/ref/contrib/auth/#id0\" 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 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 atualmente ativo – O modelo de usuário personalizado se for especificado, ou se não o <a class=\"reference internal\" href=\"/pt-br/1.9/ref/contrib/auth/#id0\" 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 você definie uma chave estrangeira ou relações muitos-para-muitos para o modelo de usuário, você deve especificar o modelo usando a definição <a class=\"reference internal\" href=\"/pt-br/1.9/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<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 com “signals” enviados pelo modelo <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code>, você deve especificar o modelo personalizado usando a definição do <a class=\"reference internal\" href=\"/pt-br/1.9/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<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<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>Falando genericamente, você deve referenciar o modelo de usuário com a definição do <a class=\"reference internal\" href=\"/pt-br/1.9/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> em código que é executado em tempo de importação. O <code class=\"docutils literal notranslate\"><span class=\"pre\">get_user_model()</span></code> somente funciona uma vez que o Django tenha importado todos os modelos.</p>\n</dd></dl>\n\n</section>\n<section id=\"specifying-a-custom-user-model\">\n<span id=\"specifying-custom-user-model\"></span><h3>Especificando um modelo <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> 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<aside class=\"admonition-model-design-considerations admonition\">\n<p class=\"admonition-title\">Considerações do design de modelo</p>\n<p>Pense bem antes de manipular informações não relacionadas diretamente com autenticação no seu modelo de usuário.</p>\n<p>Talvez seja melhor armazenar informações específicas do usuário da sua aplicação em um modelo que tem uma relação com o modelo do usuário. Isso permite a cada aplicação especificar suas próprias demandas de dados sem se arriscar em ter conflitos com outras aplicações. Por outro lado, consultas que retornam essa informação relacionada irão envolver um “join” de banco de dados, o que talvez tenha um efeito na performance.</p>\n</aside>\n<p>O Django espera que seu modelo de usuário personalizado garanta algumas caracetrísticas mínimas.</p>\n<ol class=\"arabic simple\">\n<li><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></li>\n<li><p>Seu modelo deve fornecer um maneira de endereçar o usuário de uma forma “curta” e outra “longa”. A interpretação mais comum disso seria usar o nome do usuário como identificador “curto”, e o nome completo do usuário como identificador “longo”. Porém, não tem nenhuma regra quanto ao o que estes dois métodos retornam – Se você quiser, eles podem retornar exatamente o mesmo valor.</p></li>\n</ol>\n<aside class=\"version-note version-changed\" data-version=\"1.8\">\n<p class=\"version-note-title\">Changed in Django 1.8</p><p>Versões anteriores do Django requere seu modelo para ter uma chave primária também</p>\n</aside>\n<p>A maneira mais fácil de construir um modelo de usuário compatível é herdar da <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 a implementação principal de um modelo <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>User`, incluindo senhas criptografadas e “tokes” para resetar senhas. Você deve então fornecer algumas detalhes de implementações chave.</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>Uma string descrevendo o nome do campo no modelo do usuário que é usado como identificador único. Isso será geralmente o nome do usuário de algua maneira, mas pode ser também um endereço de e-mai, ou qualquer outro identificador único. O campo <em>deve</em> ser único (isto é, ter <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>unique=True``definido na sua definição), a menos que você use um “backend” de autenticação personalizado que possa dar suporte a nomes de usuário com duplicidade.</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=\"s1\">&#39;identifier&#39;</span>\n</code></pre></div>\n<aside class=\"version-note version-added\" data-version=\"1.8\">\n<p class=\"version-note-title\">New in Django 1.8</p></aside>\n<p><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> agora suporta <a class=\"reference internal\" href=\"/pt-br/1.9/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>s. Uma vez que nao tem como passar uma instancia de modelo durante o “prompt” <a class=\"reference internal\" href=\"/pt-br/1.9/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createsuperuser</span></code></a>, espera que usuário entre com o valor do <a class=\"reference internal\" href=\"/pt-br/1.9/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> (o <a class=\"reference internal\" href=\"/pt-br/1.9/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> por padrão) de uma instância existente.</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/1.9/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/1.9/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 de um modelo de <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> que define dois campos requeridos - um “date of birth” e “height”:</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=\"s1\">&#39;date_of_birth&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;height&#39;</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><code class=\"docutils literal notranslate\"><span class=\"pre\">REQUIRED_FIELDS</span></code> deve conter todos os campos requeridos no modelo <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code>, 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 sempre serão demandados.</p>\n</aside>\n<aside class=\"version-note version-added\" data-version=\"1.8\">\n<p class=\"version-note-title\">New in Django 1.8</p></aside>\n<p><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">USERNAME_FIELD</span></code> agora suporta <a class=\"reference internal\" href=\"/pt-br/1.9/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>s. Uma vez que não tem como passar uma instância de modelo durante o “prompt” <a class=\"reference internal\" href=\"/pt-br/1.9/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createsuperuser</span></code></a>, espera que usuário entre com o valor do <a class=\"reference internal\" href=\"/pt-br/1.9/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> (o <a class=\"reference internal\" href=\"/pt-br/1.9/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> por padrão) de uma instância existente.</p>\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>Um atributo booleano que indica se o usuário é considerado “active”. Este atributo é fornecido como um atributo na <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBaseUser</span></code> padronizado omo <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. Como você escolhe como implementar isso irá depender dos detalhes do seu “backend” de autenticação escolhido. Veja a documentação do  <a class=\"reference internal\" href=\"/pt-br/1.9/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\">o</span> <span class=\"pre\">atributo</span> <span class=\"pre\">&quot;is_active&quot;</span> <span class=\"pre\">do</span> <span class=\"pre\">modelo</span> <span class=\"pre\">de</span> <span class=\"pre\">usuário</span> <span class=\"pre\">embutido</span></code></a> para detalhes.</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>Um identificador formal logon para o usuário. Uma interpretação comum seria o nome completo do usuário, mas pode ser qualquer string que identifique o usuário.</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>Um identificação informal curta do usuário. Um interpretação comum seria o peimeiro nome do usuário, mas pode ser qualquer string que identifique o usuário de forma informal. Também pode retornar o mesmo valor que <a class=\"reference internal\" href=\"/pt-br/1.9/ref/contrib/auth/#django.contrib.auth.models.User.get_full_name\" title=\"django.contrib.auth.models.User.get_full_name\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.models.User.get_full_name()</span></code></a>.</p>\n</dd></dl>\n\n<aside class=\"admonition-importing-abstractbaseuser admonition\">\n<p class=\"admonition-title\">Importando “AbstractBaseUser”</p>\n<aside class=\"version-note version-added\" data-version=\"1.9\">\n<p class=\"version-note-title\">New in Django 1.9</p></aside>\n<p>O <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBaseUser</span></code> e o <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseUserManager</span></code> são importados de <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.base_user</span></code> tal que podem ser importados sem incluir o <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code> no <a class=\"reference internal\" href=\"/pt-br/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> (isso levanta um alerta obsoleto em versões antigas e não é mais suportado no Django 1.9).</p>\n</aside>\n</dd></dl>\n\n<p>Os seguintes métodos 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.is_anonymous\">\n<span class=\"sig-name descname\"><span class=\"pre\">is_anonymous</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</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>Sempre retorna <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Essa é uma maneira de diferenciar dos objetos do tipo <a class=\"reference internal\" href=\"/pt-br/1.9/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 <a class=\"reference internal\" href=\"#django.contrib.auth.models.AbstractBaseUser.is_authenticated\" title=\"django.contrib.auth.models.AbstractBaseUser.is_authenticated\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">is_authenticated()</span></code></a> para este método.</p>\n</dd></dl>\n\n<dl class=\"py method\">\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><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</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>Sempre retorna <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. Esta é uma maneira de dizer se o usuário foi autenticado. Isso não implica em nenhuma permissão, e não verifica se o usuário é ativo - isso somente indica se o usuário forneceu um nome de usuário e senha válidos.</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>Quando a senha simples (plana) é <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, a senha será definida como uma senha inutilizável, como se <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> fosse usado.</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><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>Marca o usuário como não tendo uma senha definida.  Não é o mesmo que uma string em branco para senha. <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> para este usuário nunca retornará <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. 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>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>Retorna <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> se <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> foi chamado para este usuário.</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/1.9/topics/auth/default/#session-invalidation-on-password-change\"><span class=\"std std-ref\">Session invalidation on password change</span></a>” isto é, invalidar sessão no caso de alteração de password.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>Você deve também definir um “manager” personalizado para seu modelo <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code>. Se seu modelo <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> defini os campos <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>, <code class=\"docutils literal notranslate\"><span class=\"pre\">last_login</span></code>, e <code class=\"docutils literal notranslate\"><span class=\"pre\">date_joined</span></code> o mesmo que o <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> padrão do Django, você pode somente instalar o <a class=\"reference internal\" href=\"/pt-br/1.9/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>; Porém, se seu modelo <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> define campos diferentes, você precisa definir um “manager” personalizado que estende <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> e fornecendo dois métodos adicionais.</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=None</span></span></em>, <em class=\"sig-param\"><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></em>, <em class=\"sig-param\"><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=\"p\">):</span>\n    <span class=\"c1\"># create superuser here</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Diferente de <code class=\"docutils literal notranslate\"><span class=\"pre\">create_user()</span></code>, o <code class=\"docutils literal notranslate\"><span class=\"pre\">create_superuser()</span></code> <em>deve</em> requerer o “caller” para fornecer um password.</p>\n</dd></dl>\n\n</dd></dl>\n\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>Normalizes email addresses by lowercasing the domain portion of the\nemail address.</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><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</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.models.BaseUserManager.make_random_password\">\n<span class=\"sig-name descname\"><span class=\"pre\">make_random_password</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">length</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">10</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">allowed_chars</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.models.BaseUserManager.make_random_password\"><span class=\"visually-hidden\">Link para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Retorna uma senha randômica com o tamanho dado e a dada string de caracteres permitidos. Note que o calor padrão de <code class=\"docutils literal notranslate\"><span class=\"pre\">allowed_chars</span></code> não contém letrar que podem causar confusão, incluindo:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">i</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">l</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">I</span></code>, e <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> (letra i minúscula, letra L maiúscula, letra i maiúscula, e o número um)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">o</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">O</span></code>, e <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> (letra o minúscula, letra o maiúscula, e zero)</p></li>\n</ul>\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>Se você está inteiramente feliz com o modelo <a class=\"reference internal\" href=\"/pt-br/1.9/ref/contrib/auth/#id0\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a> do Django e você só quer adicionar algumas infomrações de perfil, você pode simplesmente criar uma subclasse de <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.models.AbstractUser</span></code> e adicionar seus campos de perfil customizados, embora recomendaríamos um modelo separado como descrito no “Considerações de design de modelo” note o <a class=\"reference internal\" href=\"#specifying-custom-user-model\"><span class=\"std std-ref\">Especificando um modelo User personalizado</span></a>. O <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractUser</span></code> fornece uma implementação completa da <a class=\"reference internal\" href=\"/pt-br/1.9/ref/contrib/auth/#id0\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a>  padrão como um <a class=\"reference internal\" href=\"/pt-br/1.9/topics/db/models/#abstract-base-classes\"><span class=\"std std-ref\">modelo abstrato</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/1.9/topics/auth/default/#built-in-auth-forms\"><span class=\"std std-ref\">forms</span></a> e <a class=\"reference internal\" href=\"/pt-br/1.9/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/1.9/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/1.9/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/1.9/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/1.9/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 tem premissas sobre o modelo de usuário e podem ser usadas como estão se estas premissas forem atendidas:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/pt-br/1.9/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>: assume que o modelo de usuário tem um campo chamado <code class=\"docutils literal notranslate\"><span class=\"pre\">email</span></code> que pode ser usado para identificar o usuário e um campo booleano chamado <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> para prevenir o “reset” de senhas por usuários inativos.</p></li>\n</ul>\n<p>Finalmente, os seguintes forms estão amarrados a <a class=\"reference internal\" href=\"/pt-br/1.9/ref/contrib/auth/#id0\" 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/1.9/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/1.9/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>Se o seu modelo de usuário personalizado é uma simples subclasse de <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractUser</span></code>, então você pode estender estes forms desta manera:</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<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\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=\"s1\">&#39;custom_field&#39;</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/1.9/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 trabalhe com o Admin, se modelo de usuário deve definir alguns atributos adicionais e métodos. Estes métodos possibilitam o admin a controlar o acesso do usuário ao conteúdo do admin:</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"id0\">\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=\"#id0\"><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 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ê irá também precisar registrar seu modelo de usuário personalizado com o admin. Se o seu modelo de usuário customizado estende <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.models.AbstractUser</span></code>, você pode usar a classe existente <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.admin.UserAdmin</span></code> do Django. Porém, se o seu modelo de usuário estende <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ê irá precisar definir uma classe <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code> personalizada. Talvez seja possível criar uma subclasse da <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.admin.UserAdmin</span></code> padrão; Porém, você irá precisar sobrescrever qualquer definição que referencie campos na <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.models.AbstractUser</span></code> que não estão na sua classe de usuário personalizada.</p>\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 incluir o framework de permissões do Django na sua própria classe User, Django fornece <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>. Isso é um modelo abstrato que você pode incluir na hierarquia de classe para seu modelos de usuário, dando a você todos os métodos e campos do banco de dados necessários para dar suporte ao modelo de permissões 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_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>Retorna <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> se o usuário tem a permissão especificada, onde <code class=\"docutils literal notranslate\"><span class=\"pre\">perm</span></code> está no formato <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 <a class=\"reference internal\" href=\"/pt-br/1.9/topics/auth/default/#topic-authorization\"><span class=\"std std-ref\">permissões</span></a>). Se o usuário é inativo, este método irá sempre retornar <code class=\"docutils literal notranslate\"><span class=\"pre\">False</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>Retorna <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> se o usuário tem cada uma das permissões especificadas, onde cara permissão este no formato <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>. Se o usuário é inativo, este método sempre irá retornar <code class=\"docutils literal notranslate\"><span class=\"pre\">False</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>Retorna <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> se o usuário tiver qualquer permissão no dado pacote (o nome da aplicação Django). Se o usuário é inativo, este métodos irá sempre retornar <code class=\"docutils literal notranslate\"><span class=\"pre\">False</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>Se você não incluir o <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 de não invocar os métodos de permissões 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 certos campos estão disponíveis no sei modelos de usuário. Se o seu modelos <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> não fornece estes campos, você irá receber um erro de banco de dados quando você veriricar as permissões.</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 limitação de modelos de usuários personalizados é que ao instalar um modelos de usuário personalizado irá quebrar qualquer modelos “proxy” que estenda  <a class=\"reference internal\" href=\"/pt-br/1.9/ref/contrib/auth/#id0\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a>. Modelos “proxy” devem ser baseados em um classe concreta; definindo um modelo de usuário personalizado, você remove a habilidade do Django de identificar com segurança a classe base.</p>\n<p>Se seu projeto usa modelos “proxy”, você deve ou modificar o “proxy” para estender o modelos de usuário que está em uso no seu projeto, ou juntar o comportamento do seu modelo “proxy” na sua subclasse de usuário.</p>\n</section>\n<section id=\"a-full-example\">\n<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>Aqui está um exemplo de uma aplicação de usuário customizada compatível com o admin. Este “user model” utiliza um endereço de e-mail como nome de usuário e requer uma data de nascimento; realiza verificação de permissões, além de uma simples administração de contas de usuários. Este model é compatível com todos forms de autenticação “auth forms” e views embutidos, exceto para os forms de criação de usuários “User creation forms”. Este exemplo ilustra como a maioria dos componentes funcionam juntos, mas não se destina a ser copiado e aplicado diretamente nos projetos para uso em produção.</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=\"p\">(</span>\n    <span class=\"n\">BaseUserManager</span><span class=\"p\">,</span> <span class=\"n\">AbstractBaseUser</span>\n<span class=\"p\">)</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=\"s1\">&#39;Users must have an email address&#39;</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=\"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=\"s1\">&#39;email address&#39;</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=\"s1\">&#39;email&#39;</span>\n    <span class=\"n\">REQUIRED_FIELDS</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;date_of_birth&#39;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_full_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># The user is identified by their email address</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\">get_short_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># The user is identified by their email address</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=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>              <span class=\"c1\"># __unicode__ on Python 2</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>Então, para registrar este aplicativo customizado e ser possível acessá-lo por meio do admin do Django, o seguinte código deve ser inserido no arquivo “admin.py” da aplicação.</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\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    <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=\"s1\">&#39;Password&#39;</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><span class=\"n\">label</span><span class=\"o\">=</span><span class=\"s1\">&#39;Password confirmation&#39;</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\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=\"s1\">&#39;email&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;date_of_birth&#39;</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\">forms</span><span class=\"o\">.</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=\"n\">UserCreationForm</span><span class=\"p\">,</span> <span class=\"bp\">self</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\">    password hash display field.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\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=\"s1\">&#39;email&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;password&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;date_of_birth&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;is_active&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;is_admin&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean_password</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Regardless of what the user provides, return the initial value.</span>\n        <span class=\"c1\"># This is done here, rather than on the field, because the</span>\n        <span class=\"c1\"># field does not have access to the initial value</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial</span><span class=\"p\">[</span><span class=\"s2\">&quot;password&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=\"s1\">&#39;email&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;date_of_birth&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;is_admin&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;is_admin&#39;</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=\"s1\">&#39;fields&#39;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s1\">&#39;email&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;password&#39;</span><span class=\"p\">)}),</span>\n        <span class=\"p\">(</span><span class=\"s1\">&#39;Personal info&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;fields&#39;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s1\">&#39;date_of_birth&#39;</span><span class=\"p\">,)}),</span>\n        <span class=\"p\">(</span><span class=\"s1\">&#39;Permissions&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;fields&#39;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s1\">&#39;is_admin&#39;</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><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;classes&#39;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s1\">&#39;wide&#39;</span><span class=\"p\">,),</span>\n            <span class=\"s1\">&#39;fields&#39;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s1\">&#39;email&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;date_of_birth&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;password1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;password2&#39;</span><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=\"s1\">&#39;email&#39;</span><span class=\"p\">,)</span>\n    <span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;email&#39;</span><span class=\"p\">,)</span>\n    <span class=\"n\">filter_horizontal</span> <span class=\"o\">=</span> <span class=\"p\">()</span>\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/1.9/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=\"s1\">&#39;customauth.MyUser&#39;</span>\n</code></pre></div>\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":"Referenciando o modelo Usuário","anchor":"referencing-the-user-model","children":[]},{"title":"Especificando um modelo User personalizado","anchor":"specifying-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":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Using Django","url":"/pt-br/1.9/topics/"},{"docname":"topics/auth/index","title":"Autenticação de usuário no Django","url":"/pt-br/1.9/topics/auth/"}],"prev":{"docname":"topics/auth/passwords","title":"Gerenciamento de senhas no Django","url":"/pt-br/1.9/topics/auth/passwords/"},"next":{"docname":"topics/cache","title":"O framework de “cache” do Django","url":"/pt-br/1.9/topics/cache/"},"formats":{"html":"/pt-br/1.9/topics/auth/customizing/","markdown":"/pt-br/1.9/topics/auth/customizing.md","json":"/pt-br/1.9/topics/auth/customizing.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/topics/auth/customizing.txt","official":"https://docs.djangoproject.com/pt-br/1.9/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","fr","ja","id","pt-br","es"]}