加入用户登录体系,session cookie 鉴权,默认账号 admin/admin123

This commit is contained in:
2026-07-24 22:17:18 +08:00
parent 273924a36a
commit c628e208ca
6 changed files with 198 additions and 6 deletions
+33 -4
View File
@@ -1,10 +1,13 @@
from contextlib import asynccontextmanager
from pathlib import Path
from fastapi import FastAPI
from fastapi import FastAPI, Request
from fastapi.responses import RedirectResponse
from jinja2 import Environment, FileSystemLoader
from app.database import engine, Base
from starlette.middleware.base import BaseHTTPMiddleware
from app.database import engine, Base, SessionLocal
from app.models import User
from app.seed import seed
from app.routers import contracts, analysis, data_input, admin
from app.routers import contracts, analysis, data_input, admin, auth
TEMPLATES_DIR = Path(__file__).parent / "templates"
@@ -14,6 +17,30 @@ def setup_jinja(app: FastAPI):
app.state.templates = env
class AuthMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
# Public paths
if request.url.path in ("/auth/login", "/auth/logout") or request.url.path.startswith("/auth/"):
return await call_next(request)
# Check session
user_id = request.cookies.get("ft_session")
if user_id:
db = SessionLocal()
try:
user = db.query(User).filter(User.id == int(user_id)).first()
if user:
request.state.user = user
return await call_next(request)
except (ValueError, TypeError):
pass
finally:
db.close()
# Redirect to login
return RedirectResponse(f"/auth/login?next={request.url.path}", status_code=303)
@asynccontextmanager
async def lifespan(app: FastAPI):
setup_jinja(app)
@@ -24,6 +51,9 @@ async def lifespan(app: FastAPI):
app = FastAPI(title="期货量化系统", lifespan=lifespan)
app.add_middleware(AuthMiddleware)
app.include_router(auth.router)
app.include_router(contracts.router)
app.include_router(analysis.router)
app.include_router(data_input.router)
@@ -32,5 +62,4 @@ app.include_router(admin.router)
@app.get("/")
def root():
from fastapi.responses import RedirectResponse
return RedirectResponse("/contracts")