38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
from sqladmin.authentication import AuthenticationBackend
|
|
from starlette.requests import Request
|
|
|
|
from app.config import settings
|
|
from app.users.auth import authenticate_user_by_username, create_access_token, validate_user_admin, ADMIN_USER
|
|
from app.users.dependencies import get_current_user
|
|
|
|
|
|
class AdminAuth(AuthenticationBackend):
|
|
async def login(self, request: Request) -> bool:
|
|
form = await request.form()
|
|
username, password = form["username"], form["password"]
|
|
|
|
user = await authenticate_user_by_username(username, password)
|
|
if user and user.role == ADMIN_USER:
|
|
access_token = create_access_token({"sub": str(user.id)})
|
|
request.session.update({"token": access_token})
|
|
|
|
return True
|
|
|
|
async def logout(self, request: Request) -> bool:
|
|
# Usually you'd want to just clear the session
|
|
request.session.clear()
|
|
return True
|
|
|
|
async def authenticate(self, request: Request) -> bool:
|
|
token = request.session.get("token")
|
|
|
|
if not token:
|
|
return False
|
|
|
|
user = await get_current_user(token)
|
|
if user:
|
|
return await validate_user_admin(user.id)
|
|
return False
|
|
|
|
|
|
authentication_backend = AdminAuth(secret_key=settings.SECRET_KEY)
|