You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

63 rivejä
1.8 KiB

  1. from fastapi_login import LoginManager
  2. from fastapi.requests import Request
  3. from fastapi.exceptions import HTTPException
  4. from .config import Config
  5. import hashlib
  6. import binascii
  7. class NotAuthenticatedException(Exception):
  8. pass
  9. class MyLoginManager(LoginManager):
  10. @property
  11. def not_authenticated_exception(self):
  12. # FastAPI userland intercetterà questa eccezione e farà il redirect (vedi app.py)
  13. return NotAuthenticatedException()
  14. # Istanzia il manager senza custom_exception
  15. manager = MyLoginManager(
  16. Config.secret,
  17. token_url=Config.token_url
  18. )
  19. def hash_password(plaintext: str):
  20. """
  21. Hash della password (usa il pwd_context configurato in fastapi-login/passlib).
  22. """
  23. return manager.pwd_context.hash(plaintext)
  24. def verify_password(plaintext: str, hashed: str):
  25. """
  26. Verifica: prima confronta l'NT hash (MD4/UTF-16LE) se il db salva così;
  27. in quel caso, per coerenza, facciamo comunque una verifica col pwd_context.
  28. """
  29. nt = hashlib.new('md4', plaintext.encode('utf-16le')).digest()
  30. nt_hex = binascii.hexlify(nt).upper().decode("utf-8")
  31. if hashed == nt_hex:
  32. # Forza una verifica con passlib per mantenere compatibilità con pwd_context
  33. return manager.pwd_context.verify(plaintext, manager.pwd_context.hash(plaintext))
  34. else:
  35. # Se il db salva già un hash passlib, puoi cambiare questa riga in:
  36. # return manager.pwd_context.verify(plaintext, hashed)
  37. return False
  38. def is_admin(request: Request):
  39. """
  40. Esempio placeholder: alza 401 se non autenticato o non admin.
  41. Integra con la tua logica utente.
  42. """
  43. user = getattr(request.state, "user", None)
  44. if user is None:
  45. raise HTTPException(status_code=401)
  46. if not getattr(user, "is_admin", False):
  47. raise HTTPException(status_code=401)
  48. return user