Login funcionando

This commit is contained in:
LS
2025-03-24 14:50:42 -03:00
parent cccca2ef29
commit 0f4056fbff
5 changed files with 203 additions and 117 deletions

View File

@@ -4,16 +4,32 @@ from sqlalchemy.ext.declarative import declarative_base
from werkzeug.security import generate_password_hash, check_password_hash
import pyotp
import os
from pathlib import Path
from sqlalchemy.pool import NullPool
# Configurar caminho do banco de dados
db_dir = Path.home() / '.local' / 'share' / 'controles'
db_dir.mkdir(parents=True, exist_ok=True)
db_path = db_dir / 'database.db'
# Configurar engine com NullPool
engine = create_engine(
f'sqlite:///{db_path}',
echo=True,
poolclass=NullPool # Usar NullPool ao invés do pool padrão
)
Base = declarative_base()
engine = create_engine('sqlite:///database.db', echo=True)
SessionLocal = sessionmaker(bind=engine)
def get_db_connection():
"""
Retorna uma nova sessão do banco de dados
"""
return SessionLocal()
try:
return SessionLocal()
finally:
engine.dispose()
def execute_query(query, params=None):
"""
@@ -195,11 +211,17 @@ class Usuario(Base):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
result = check_password_hash(self.password_hash, password)
print(f"Verificação de senha para {self.username}: {'sucesso' if result else 'falha'}")
return result
def verify_otp(self, otp_code):
totp = pyotp.TOTP(self.otp_secret)
return totp.verify(otp_code)
result = totp.verify(otp_code)
print(f"Verificação OTP para {self.username}")
print(f"Código fornecido: {otp_code}")
print(f"Resultado da verificação: {'válido' if result else 'inválido'}")
return result
def get_otp_uri(self):
totp = pyotp.TOTP(self.otp_secret)
@@ -234,40 +256,61 @@ class RolePermissao(Base):
permissao = relationship("Permissao", back_populates="roles")
# Remover o banco de dados existente (se existir)
if os.path.exists('database.db'):
os.remove('database.db')
if os.path.exists(db_path):
os.remove(db_path)
# Criar todas as tabelas novamente
Base.metadata.create_all(engine)
# Criar roles iniciais
def create_initial_data():
session = get_db_connection()
def init_database():
"""Inicializa o banco de dados com dados básicos"""
print("Inicializando banco de dados...")
# Criar todas as tabelas
Base.metadata.create_all(engine)
session = SessionLocal()
try:
# Criar role de admin
admin_role = Role(nome="Administrador", nivel=1)
session.add(admin_role)
session.flush() # Para obter o ID da role
# Criar usuário admin
admin = Usuario(
username="admin",
password="admin123",
is_admin=True
)
admin.role_id = admin_role.id
session.add(admin)
session.commit()
print(f"Segredo OTP do admin: {admin.otp_secret}")
print("Usuário admin criado com sucesso!")
# Verificar se já existe um admin
admin = session.query(Usuario).filter_by(username="admin").first()
if not admin:
print("Criando role de administrador...")
# Criar role de admin
admin_role = session.query(Role).filter_by(nome="Administrador").first()
if not admin_role:
admin_role = Role(nome="Administrador", nivel=1)
session.add(admin_role)
session.commit()
print("Criando usuário admin...")
# Criar usuário admin
admin = Usuario(
username="admin",
password="admin123",
is_admin=True
)
admin.email = "admin@example.com"
admin.role_id = admin_role.id
session.add(admin)
session.commit()
print("=== Usuário Admin Criado ===")
print(f"Username: admin")
print(f"Senha: admin123")
print(f"Email: {admin.email}")
print(f"OTP Secret: {admin.otp_secret}")
else:
print("Usuário admin já existe")
except Exception as e:
print(f"Erro ao criar dados iniciais: {e}")
print(f"Erro na inicialização do banco: {e}")
session.rollback()
raise
finally:
session.close()
# Inicializar o banco de dados automaticamente quando o módulo for importado
init_database()
# Executar a criação dos dados iniciais
if __name__ == "__main__":
create_initial_data()
init_database()