|
- from fastapi_login import LoginManager
- from fastapi.requests import Request
- from fastapi.exceptions import HTTPException
-
- from .config import Config
- import hashlib
- import binascii
-
-
- class NotAuthenticatedException(Exception):
- pass
-
-
- class MyLoginManager(LoginManager):
- @property
- def not_authenticated_exception(self):
- # FastAPI userland intercetterà questa eccezione e farà il redirect (vedi app.py)
- return NotAuthenticatedException()
-
-
- # Istanzia il manager senza custom_exception
- manager = MyLoginManager(
- Config.secret,
- token_url=Config.token_url
- )
-
-
- def hash_password(plaintext: str):
- """
- Hash della password (usa il pwd_context configurato in fastapi-login/passlib).
- """
- return manager.pwd_context.hash(plaintext)
-
-
- def verify_password(plaintext: str, hashed: str):
- """
- Verifica: prima confronta l'NT hash (MD4/UTF-16LE) se il db salva così;
- in quel caso, per coerenza, facciamo comunque una verifica col pwd_context.
- """
- nt = hashlib.new('md4', plaintext.encode('utf-16le')).digest()
- nt_hex = binascii.hexlify(nt).upper().decode("utf-8")
- if hashed == nt_hex:
- # Forza una verifica con passlib per mantenere compatibilità con pwd_context
- return manager.pwd_context.verify(plaintext, manager.pwd_context.hash(plaintext))
- else:
- # Se il db salva già un hash passlib, puoi cambiare questa riga in:
- # return manager.pwd_context.verify(plaintext, hashed)
- return False
-
-
- def is_admin(request: Request):
- """
- Esempio placeholder: alza 401 se non autenticato o non admin.
- Integra con la tua logica utente.
- """
- user = getattr(request.state, "user", None)
- if user is None:
- raise HTTPException(status_code=401)
- if not getattr(user, "is_admin", False):
- raise HTTPException(status_code=401)
- return user
|