Files
CosScene/server/app/admin/auth.py
T
2026-05-09 16:40:29 +08:00

55 lines
1.6 KiB
Python

from sqladmin.authentication import AuthenticationBackend
from sqlalchemy import select
from starlette.requests import Request
from app.core.security import verify_password
from app.db.session import sync_engine
from app.models.user import User
from sqlalchemy.orm import Session
class AdminAuthBackend(AuthenticationBackend):
async def login(self, request: Request) -> bool:
form = await request.form()
username = form.get("username", "")
password = form.get("password", "")
with Session(sync_engine) as session:
result = session.execute(
select(User).where(
(User.phone == username) | (User.email == username)
)
)
user = result.scalar_one_or_none()
if not user:
return False
if user.role not in ("admin", "moderator"):
return False
if not verify_password(str(password), user.password_hash):
return False
request.session.update({"admin_user_id": user.id})
return True
async def logout(self, request: Request) -> bool:
request.session.clear()
return True
async def authenticate(self, request: Request) -> bool:
user_id = request.session.get("admin_user_id")
if not user_id:
return False
with Session(sync_engine) as session:
result = session.execute(select(User).where(User.id == user_id))
user = result.scalar_one_or_none()
if not user or user.role not in ("admin", "moderator"):
return False
return True