Implementando autenticação no Django – Parte 2 | Blog TreinaWeb
Veja neste artigo como implementar os recursos de logout, alteração de senha e proteção de páginas em projetos Django.
Continuando a implementação do módulo de autenticação em uma aplicação Django que iniciamos no artigo "Implementando autenticação no Django – Parte 1", veremos neste artigo como implementar os métodos de logout, alterar senha do usuário e proteger páginas para que só sejam acessadas por usuários devidamente autenticados.
A principal função do método de logout é remover a sessão do usuário que está logado na aplicação, fazendo com que este login não esteja mais ativo no sistema. Assim como o método de login, o Django possui, em seu módulo de autenticação, o método para deslogar usuários. Para implementá-lo, basta criar um método no arquivo views.py com o seguinte conteúdo:
def deslogar_usuario(request):
Basicamente, o médoto deslogar_usuario recebe uma requisição e remove o usuário que está logado dela. Simplesmente assim :)
Agora, para acessar o método de deslogar_usuario, precisamos criar sua rota no arquivo urls.py da aplicação:
path('deslogar_usuario', deslogar_usuario, name="deslogar_usuario"),
Com isso, ao acessar a rota http://localhost:8000/deslogar_usuario, a sessão será destruída e o usuário deslogado do nosso projeto.
Uma outra funcionalidade importante para um sistema de autenticação é o método para alterar senha do usuário logado. Com o Django, esta implementação é bem simples.
Primeiro, vamos criar um método alterar_senha no arquivo views.py do projeto com o seguinte conteúdo:
def alterar_senha(request):
form_senha = PasswordChangeForm(request.user, request.POST)
if form_senha.is_valid():
user = form_senha.save()
form_senha = PasswordChangeForm(request.user)
return render(request, 'alterar_senha.html', {'form_senha': form_senha})
Basicamente, este método irá criar um PasswordChangeForm vazio para que o usuário que estiver logado digite as informações necessárias para alteração de senha (senha antiga, nova senha e confirmação da nova senha). Depois que o usuário submeter o formulário, verificamos se ele é válido e, caso positivo, alteramos a senha do usuário com o método update_session_auth_hash e redirecionamos para a página index da aplicação.
Para que o usuário consiga digitar as informações necessárias para alterar sua senha, criaremos um template chamado alterar_senha no diretório templates da nossa aplicação. Ele é bem simples, apenas renderizamos os inputs necessários para esta funcionalidade:
<title>Alterar senha</title>
{{form_senha.old_password.errors}}
<label>Senha antiga: </label>
{{form_senha.old_password}}
{{form_senha.new_password1.errors}}
<label>Nova senha: </label>
{{form_senha.new_password1}}
{{form_senha.new_password2.errors}}
{{form_senha.new_password2}}
<input type="submit" value="Alterar" class="btn btn-primary">
Por fim, precisamos criar a rota responsável por executar o método alterar_senha. Para isso, no arquivo urls.py da aplicação, adicionamos a seguinte linha no array urlpatterns:
path('alterar_senha/', alterar_senha, name='alterar_senha'),
Com isso, ao acessar a rota http://localhost:8000/alterar_senha, veremos o seguinte resultado:
É por meio desta página que o usuário poderá alterar sua senha na aplicação.
Sabemos que a principal vantagem de implementar a autenticação em nossas aplicações é a de proteger páginas e recursos para que apenas usuários devidamente autenticados possam acessá-las. Para isso, só precisamos adicionar o decorator login_required nos métodos que queremos proteger:
@login_required(login_url='/logar_usuario')
Agora, ao tentar acessar as páginas para alterar senha, deslogar usuário e index, o Django irá verificar se existe algum usuário logado e, caso contrário, redirecionará para a página de login.
Nesta série de artigo, vimos o quão fácil é implementar os principais recursos de autenticação com o Django. A autenticação é a melhor forma de garantir que os recursos de um projeto só sejam acessados por usuário previamente cadastrados e autenticados, garantindo uma maior segurança do projeto.