- 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)
63 lines
1.5 KiB
Python
63 lines
1.5 KiB
Python
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()
|