Files
MCM/db/database.py
itdrui.de 6eb27a62b1 feat: Multi-User-Unterstützung mit JWT-Authentifizierung
- User-Modell (username, password_hash, role admin/user, is_active)
- Standard-Admin-Benutzer wird beim ersten Start automatisch angelegt
- JWT-Tokens (HS256) für Benutzer-Sessions, konfigurierbare Ablaufzeit
- API-Key bleibt für service-to-service-Calls (backward-compatible)
- POST /api/v1/auth/login → JWT-Token
- GET  /api/v1/auth/me   → aktueller Benutzer
- CRUD /api/v1/users/    → Benutzerverwaltung (nur Admin)
- TUI zeigt Login-Screen beim Start; nach Erfolg → MainScreen
- Passwort-Hashing mit bcrypt (python-jose für JWT)
2026-03-04 20:55:13 +01:00

63 lines
1.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, sessionmaker
from sqlalchemy.pool import StaticPool
from config import settings
class Base(DeclarativeBase):
pass
_connect_args = {}
_pool_class = None
if settings.database_url.startswith("sqlite"):
_connect_args = {"check_same_thread": False}
_pool_class = StaticPool
engine = create_engine(
settings.database_url,
connect_args=_connect_args,
**({"poolclass": _pool_class} if _pool_class else {}),
echo=settings.debug,
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
def init_db() -> None:
from db import models # noqa: F401 Modelle müssen importiert sein
Base.metadata.create_all(bind=engine)
_create_default_admin()
def _create_default_admin() -> None:
"""Legt beim ersten Start einen Admin-Benutzer an, falls keine User existieren."""
import bcrypt
from db.models import User
db = SessionLocal()
try:
if not db.query(User).first():
pw_hash = bcrypt.hashpw(
settings.default_admin_password.encode(), bcrypt.gensalt()
).decode()
admin = User(
username=settings.default_admin_user,
password_hash=pw_hash,
role="admin",
is_active=True,
)
db.add(admin)
db.commit()
finally:
db.close()