加入用户登录体系,session cookie 鉴权,默认账号 admin/admin123
This commit is contained in:
+33
-4
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user