Cap 9) Autenticando e Autorizando nossos Usuários

  1. Como estamos salvando os dados de nossos usuários utilizando a classe User da API de autenticação e autorização do Django, será extremamente fácil implementarmos um mecanismo de login em nossa aplicação, pois vamos usar os recursos disponíveis na própria API. Para isso, basta mapermos nossa url de login e informar a view que será utilizada pela API, da seguinte forma:

No arquivo connectedin/usuarios/urls.py, faça

...

urlpatterns = patterns('',
    ...
    url(r'^login/$', 'django.contrib.auth.views.login', {'template_name':'usuarios/login.html'}, name='login'),
    url(r'^logout/$', 'django.contrib.auth.views.logout_then_login', {'login_url':'/login/'}, name='logout'),
    ...
)

Observe em connectedin/connectedin/settings.py que nós realmente temos a aplicação de autenticação django.contrib.auth habilitada em nosso projeto

  1. Implemente o formulário de login, conforme o template usuarios/login.html que definimos na url acima. Crie um arquivo connectedin/usuarios/templates/usuarios/login.html com o código:

    {% extends "usuarios/base.html" %}

    {% block body %}

     <form class="form-signin" role="form" action="{% url 'django.contrib.auth.views.login' %}" method="post">
         {% csrf_token %}
    
         <h2 class="form-signin-heading">Login</h2>
                 
         <input type="text" id="id_username" name="username" class="form-control" placeholder="Email" required autofocus>
                 
         <input type="password" id="id_passowrd" name="password" class="form-control" placeholder="Senha" required>
                 
         <button class="btn btn-lg btn-primary btn-block" type="submit" value="Login">Login</button>
                 
         <input type="hidden" name="next" value="{{ next }}" />
                 
         {% if form.errors %}
           <div class="alert alert-danger">
             <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
             Por favor, verifique o Email e/ou Senha informados
           </div>
         {% endif %}
    
         <a href="{% url 'registrar' %}">registre-se</a>
     </form>
    

    {% endblock %}

  2. Atualize o arquivo connectedin/connectedin/settings.py com as três linhas a seguir:

    LOGIN_URL="/login/" LOGOUT_URL="/logout/" LOGIN_REDIRECT_URL="/"

  3. Nossa aplicação ainda não está protegida. Para isso, precisamos adicionar o decorator @login_required em todas as views do arquivo connectedin/perfis/views.py. Utilize o import from django.contrib.auth.decorators import login_required

  4. Neste arquivo altere, também, o método __get_perfil_logado para retornar o perfil logado:

    ...

    def __get_perfil_logado(request): return request.user.perfil

    ...

  5. Altere, também, o arquivo de template connectedin/perfis/templates/perfis/base.html para exibir o nome do usuário logado:

    ...

    ...

Acessando o usuário diretamente no template sem precisar recuperá-lo na view nos permite melhorar outros pontos do código.