Skip to content

Uma solução simples para quem quer implementar uma interface em Python capaz de fazer logins e cadastros.

License

Notifications You must be signed in to change notification settings

igorgp06/Login-System

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Login-System Logo

Sistema de login e cadastro usando Python e SQLite3

Um sistema de login e cadastro. Ele usa fundamentalmente a linguagem Python e SQlite3.

Introdução

Este projeto apresenta uma solução simples e eficiente para implementarmos um sistema de login e cadastro com facilidade. Usamos a biblioteca CustomTKinter para criarmos a interface do sistema, usamos várias funções do CustomTKinter para darmos um rosto a nossa aplicação. Para o sistema de banco de dados, usamos a linguagem Python e o SQLite3, onde trabalhamos com várias funções em nosso sistema. E finalmente, usando o hashlib fizemos um sistema que faz a criptografia das senhas dos usuários, garantindo uma certa segurança quando trabalhamos com nosso banco de dados.

Funcionalidades

  • Cadastro de Usuários:

    Permite que novos usuários se cadastrem no sistema com validação de dados, impedindo nomes de usuários duplicados, senhas pequenas e etc.
    Acesse diretamente o vídeo no YouTube de como funciona o cadastro de usuários e o banco de dados aqui.

  • Login de Usuários:

    Autenticação de usuários cadastrados, validando o nome de usuário e a senha e assim liberando o seu acesso.
    Acesse diretamente o vídeo no YouTube para ver como funciona o login de usuários aqui.

  • Armazenamento Seguro:

    Usando o sha256 da bliblioteca hashlib, nós criptografamos as senhas dos usuários antes de enviar as informações ao banco de dados. Assim que o usuário que o tenta fazer login e as informações coincidem, a senha é descriptografada e autenticada, liberando assim, o login do usuário.

Tecnologias utilizadas

Pré-requisitos

Antes de começar, você vai precisar ter instalado em sua máquina as ferramentas básicas, como:
  • Python 3 como principal linguagem.

  • Pip para instalar as dependências.

  • Para manipular o código é interessante ter um editor, como VSCode.

  • Para manipular o banco de dados, instale o SQLite3.

  • mais informações em ../about/requirements.txt

Instalação e Uso

Após instalar os requisitos minimos, siga estes passos:

Instalação

  1. Clone o repositório:

    git clone https://github.com/igorgp06/Login-System.git
  2. Crie um ambiente virtual (opcional, porém recomendado):

    python -m venv venv
    source venv/bin/activate  # Para Linux/macOS
    venv\Scripts\activate      # Para Windows
  3. Instale as dependências:

    pip install -r requirements.txt

Execução

  1. Navegue até o diretório do projeto:
    cd Login-System
  2. Entre na pasta main
    cd main
  3. Execute o script principal:
    python app.py

Lembre-se, os vídeos de como funciona o sistema de login, cadastro e como abrir o banco de dados podem ser encontrados diretamente no YouTube.

Detalhes Técnicos

Aqui vai estar os pricipais detalhes técnicos do sistema, explicando como a tabela está dividida, como a criptografia funciona neste código e os datalhes de como funciona a validação dos dados e capturas de possiveis erros nos sistema.

Estrutura do Banco de Dados

O Banco de Dados está estruturado em cinco (5) seções, sendo elas:

id Username UserEmail UserPassword UserPasswordConf
1 exemplo 1 exemplo1@exemplo.com (criptografada) (criptografada)
2 exemplo 2 exemplo2@exemplo.com (criptografada) (criptografada)

No SQLite3 você vai ver isto:

Cada uma dessas seções tem seu significado e importância, sendo elas:

Tabela users - Tabela criada para armazenar os dados dos usuários.
ID - Responsável por gerar um número de identificação pro usuário em ordem crescente.
Username - Nome que o usuário escolheu e será usado para o efetuar o login.
UserEmail - Email do usuário, não possui validação.
UserPassword - Senha criptografada do usuário.
UserPasswordConf - Confirmação da senha do usuário, ela também é criptografada.

Criptografia

começaremos importar a biblioteca hashlib e em seguida criaremos uma def que criptografa as senhas dos usuários. Chamamos esta função antes de enviar as informações para o banco de dados, ou seja, as senhas são criptografadas assim que o cadastro é aceito enviando informações mais seguras para o banco de dados.

# função para criptografar as senhas
 def hash_password(self, password):
     # criação dos hashs das senhas
     return hashlib.sha256(password.encode()).hexdigest()
# salvando as entrys em variáveis criptografadas
hashed_password = self.hash_password(self.cad_userpassword_entry_get)
hashed_password_conf = self.hash_password(self.cad_userpassword_conf_entry_get)
# Inserindo os dados e as senhas criptografadas na tabela
self.cursor.execute("""
   INSERT INTO users (Username, UserEmail, UserPassword, UserPasswordConf)
    VALUES (?, ?, ?, ?)""", (self.cad_username_entry_get,
                             self.cad_useremail_entry_get,
                             hashed_password,
                             hashed_password_conf))    

Validação dos dados

Usamos try except e finally para capturarmos erros. Usando o try e if para capturar erros de cadastro do usuário, onde não é permitido nomes de usuários duplicados, senhas pequenas e etc.

try:
   # Verificando se os dados foram inseridos corretamente
   if (self.cad_username_entry_get == "" 
         or self.cad_useremail_entry_get == ""
         or self.cad_userpassword_entry_get == ""
         or self.cad_userpassword_conf_entry_get == ""):
         messagebox.showerror(title="Erro 001",
                           message="Favor, preencha todos os campos com as devidas informações!")
         return
         
   if (len(self.cad_username_entry_get) < 4):
         messagebox.showerror(title="Erro 002", 
                           message="O seu nome de usuário deve conter pelo menos 4 caracteres!")
         return

   if (self.cad_userpassword_entry_get != self.cad_userpassword_conf_entry_get):
         messagebox.showerror(title="Erro 003", 
                           message="As senhas inseridas devem ser iguais!\nFavor, confirme as senhas novamente.")
         return
         
   if (len(self.cad_userpassword_entry_get) < 5):
         messagebox.showerror(title="Erro 004", 
                           message="As senhas devem conter pelo menos 5 caracteres!")
         return
   
   # Verificando se o nome de usuário existe
   self.cursor.execute("SELECT * FROM users WHERE Username = ?", (self.cad_username_entry_get,))
   existing_user = self.cursor.fetchone()

   if existing_user:
         messagebox.showerror(title="Erro 005",
                              message="O nome de usuário inserido já existe!\nFavor, escolha outro nome de usuário.")
         return

   # Inserindo os dados na tabela se não ouver nenhum erro
   self.cursor.execute("""
         INSERT INTO users (Username, UserEmail, UserPassword, UserPasswordConf)
         VALUES (?, ?, ?, ?)""", (self.cad_username_entry_get,
                                 self.cad_useremail_entry_get,
                                 hashed_password,
                                 hashed_password_conf))

   self.conn.commit()
   self.clear_cad_entry()
   self.login_page()
   messagebox.showinfo(title="Sucesso!",
                        message=f"Seu usuário '{self.cad_username_entry_get}' foi criado com sucesso!")

Captura de erros

Aqui apresentarei como os erros são identificados e tradados no projeto, ele usa como base para capturalos except e finally.

Captura de erros no Banco de Dados Usando o primeiro except para capturar possiveis erros no banco de dados, onde em nosso terminal ele apresenta uma mensagem de erro e informa qual foi o erro detectado no Banco de Dados.

except sqlite3.Error as e:
    print("Erro no banco de dados", e)
    messagebox.showerror(title="Erro 006",
                         message="Ocorreu um erro no banco de dados!\nFavor, tente novamente.")

Captura de erros no sistema O último except tem a função de dizer se o erro foi diretamente no sistema, ele apresenta uma mensagem de erro e informa qual foi o erro detectado no sistema.

except Exception as e:
    print("Erro inesperado no sistema", e)
    messagebox.showerror(title="Erro 007",
                         message="Ocorreu um erro inesperado no sistema!\nFavor, tente novamente.")

Fechando o banco de dados Assim que todas as verificações forem concluídas, o finally vai fechar o nosso banco de dados.

finally:
    self.db_disconnect()

Contribuindo

Contribuições são sempre bem-vindas! Sinta-se a vontade para relatar bugs, sugestões e melhorias no issues.
Correção de bugs e novas funcionalidades também são sempre muito bem vindas, crie um pull request aqui e ajude-me com suas melhorias e correções.

Licença e código de Conduta

O projeto Login-System esá sujeito a licença APACHE LICENSE 2.0.

Por favor, siga o NOTICE, CODE OF CONDUCT e leia a LICENSE desse projeto para evitar incomodações futuras.

Leia nosso CODE OF CONDUCT.

Contato

Para esclarer dúvidas, mandar sugestões ou até mesmo bater um papo comigo, mande um Email para contateme.igorgp@gmail.com!

Desenvolver responsável

Igor Gonçalves Pinheiro ou igorgp06

Créditos

As imagens usadas no projeto foram retiradas da storyset.

login.png

Signup.png

Redes Sociais

Repository Status