feat:增加权限控制

This commit is contained in:
2025-09-23 15:01:34 +08:00
parent f07b23b825
commit 6977463918
11 changed files with 227 additions and 6 deletions

68
.gitignore vendored Normal file
View File

@@ -0,0 +1,68 @@
# Python 字节码文件
__pycache__/
*.py[cod]
*$py.class
# C 扩展
*.so
# 分发/打包
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# 虚拟环境
venv/
env/
ENV/
.env
.venv
# 测试
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
# Django 相关
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
media/
# PyCharm IDE
.idea/
*.iml
*.iws
*.ipr
# VS Code
.vscode/
*.code-workspace
.history/
# 其他
.DS_Store
logs/
packages/

View File

@@ -1,6 +1,7 @@
from fastapi import FastAPI from fastapi import FastAPI
from .blog import router as blog_router from .blog import router as blog_router
from .session import router as session_router
def register_routers(app: FastAPI): def register_routers(app: FastAPI):
app.include_router(blog_router, prefix="") app.include_router(blog_router, prefix="")
app.include_router(session_router, prefix="")

Binary file not shown.

View File

@@ -3,6 +3,7 @@ from typing import List
from fastapi import APIRouter, Depends, Query, Request from fastapi import APIRouter, Depends, Query, Request
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from config.auth import verify_token
from schemas.blog import BlogResponse, BlogQuery, BlogCategoryResponse, BlogStatsResponse, \ from schemas.blog import BlogResponse, BlogQuery, BlogCategoryResponse, BlogStatsResponse, \
BlogLatestResponse, BlogCommentCreate, BlogCommentResponse, BlogVisitResponse, BlogCreate, BlogUpdate BlogLatestResponse, BlogCommentCreate, BlogCommentResponse, BlogVisitResponse, BlogCreate, BlogUpdate
from schemas.pagination import PageResult from schemas.pagination import PageResult
@@ -35,17 +36,17 @@ def query_blog_by_id(blog_id: int, db: Session = Depends(get_db)):
@router.post("", summary="新增博客内容", response_model=bool) @router.post("", summary="新增博客内容", response_model=bool)
def add_blog(blog: BlogCreate, db: Session = Depends(get_db)): def add_blog(blog: BlogCreate, db: Session = Depends(get_db), _ = Depends(verify_token)):
return blog_service.add_blog(db, blog) return blog_service.add_blog(db, blog)
@router.put("/{blog_id}", summary="更新博客内容", response_model=bool) @router.put("/{blog_id}", summary="更新博客内容", response_model=bool)
def update_blog(blog_id: int, blog: BlogUpdate, db: Session = Depends(get_db)): def update_blog(blog_id: int, blog: BlogUpdate, db: Session = Depends(get_db), _ = Depends(verify_token)):
return blog_service.update_blog(db, blog_id, blog) return blog_service.update_blog(db, blog_id, blog)
@router.delete("/{blog_id}", summary="删除博客内容", response_model=bool) @router.delete("/{blog_id}", summary="删除博客内容", response_model=bool)
def delete_blog(blog_id: int, db: Session = Depends(get_db)): def delete_blog(blog_id: int, db: Session = Depends(get_db), _ = Depends(verify_token)):
return blog_service.delete_blog(db, blog_id) return blog_service.delete_blog(db, blog_id)

18
api/session.py Normal file
View File

@@ -0,0 +1,18 @@
from fastapi import APIRouter, Depends
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.orm import Session
from config.database import get_db
from schemas.session import SessionResponse
from service import session_service
router = APIRouter(
prefix="/session",
tags=["会话"],
responses={404: {"description": "Not found"}}
)
@router.post("", summary="创建会话", response_model=SessionResponse)
def create(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
return session_service.create(db, form_data.username, form_data.password)

View File

@@ -1 +1 @@
fastapi~=0.115.12 fastapi~=0.115.12

6
schemas/session.py Normal file
View File

@@ -0,0 +1,6 @@
from pydantic import BaseModel
class SessionResponse(BaseModel):
access_token: str
token_type: str

View File

@@ -0,0 +1,23 @@
from sqlalchemy.orm import Session
from schemas.session import SessionResponse
from config.auth import create_token, create_payload
from middleware.exceptions import AppException
def create(db: Session, username: str, password: str) -> SessionResponse:
# 1. 校验账户是否存在
if username != "admin":
raise AppException(f"该账户{username}不存在")
# 2. 校验密码是否正确
if password != "19940822Cxx":
raise AppException("密码错误")
return SessionResponse(
access_token=create_token(create_payload(username)),
token_type="Bearer"
)

View File

@@ -710,3 +710,107 @@
2025-09-22 19:35:46.701 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} 2025-09-22 19:35:46.701 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-22 19:36:39.565 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 2025-09-22 19:36:39.565 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-22 19:36:39.565 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} 2025-09-22 19:36:39.565 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 13:38:24.061 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/
2025-09-23 13:38:24.072 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404
2025-09-23 13:38:24.176 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/favicon.ico
2025-09-23 13:38:24.176 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404
2025-09-23 13:38:28.402 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs
2025-09-23 13:38:50.471 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs
2025-09-23 13:38:51.104 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/openapi.json
2025-09-23 13:38:55.964 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 13:38:55.964 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 13:38:55.964 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 401
2025-09-23 13:40:23.368 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 13:40:23.369 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 13:40:32.054 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/blog
2025-09-23 13:40:32.056 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 401
2025-09-23 13:46:14.026 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs
2025-09-23 13:46:14.554 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/openapi.json
2025-09-23 13:46:19.941 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs
2025-09-23 13:46:20.022 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/openapi.json
2025-09-23 13:46:24.491 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs
2025-09-23 13:46:24.553 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/openapi.json
2025-09-23 13:49:32.889 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs
2025-09-23 13:49:32.991 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/openapi.json
2025-09-23 13:52:53.666 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs
2025-09-23 13:52:53.766 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/openapi.json
2025-09-23 13:53:00.113 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs
2025-09-23 13:53:00.173 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/openapi.json
2025-09-23 13:57:51.959 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 13:57:51.960 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 13:57:56.317 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398
2025-09-23 13:57:56.422 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0
2025-09-23 13:57:57.914 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398
2025-09-23 13:57:58.014 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 13:57:58.014 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 13:57:58.028 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats
2025-09-23 13:57:58.044 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest
2025-09-23 13:57:58.074 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 13:57:58.074 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 13:58:39.770 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398
2025-09-23 13:58:39.785 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0
2025-09-23 13:58:41.260 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398
2025-09-23 13:58:41.262 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 401
2025-09-23 14:02:37.558 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session?name=estun&password=medical
2025-09-23 14:02:37.558 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'name': 'estun', 'password': 'medical'}
2025-09-23 14:02:37.560 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 422
2025-09-23 14:03:42.464 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:03:42.466 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 422
2025-09-23 14:06:05.092 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:06:05.095 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 该账户estun不存在 - 详情: None
2025-09-23 14:07:04.464 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:07:04.467 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 该账户admin不存在 - 详情: None
2025-09-23 14:07:53.591 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:07:53.596 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 该账户admin不存在 - 详情: None
2025-09-23 14:08:48.398 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:26:31.145 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:26:56.041 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:26:57.633 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 14:26:57.633 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 14:26:59.248 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398
2025-09-23 14:26:59.333 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0
2025-09-23 14:27:00.498 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398
2025-09-23 14:27:00.500 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 401
2025-09-23 14:31:33.983 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:31:35.668 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 14:31:35.668 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 14:31:37.840 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398
2025-09-23 14:31:37.897 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0
2025-09-23 14:31:39.290 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398
2025-09-23 14:31:39.291 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 401
2025-09-23 14:37:39.603 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:37:41.438 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 14:37:41.438 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 14:37:51.897 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398
2025-09-23 14:37:51.970 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0
2025-09-23 14:37:53.706 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398
2025-09-23 14:37:53.708 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 401
2025-09-23 14:38:31.930 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:38:33.214 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 14:38:33.214 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 14:38:34.724 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398
2025-09-23 14:38:34.779 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0
2025-09-23 14:38:35.684 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398
2025-09-23 14:38:35.686 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 401
2025-09-23 14:40:02.522 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398
2025-09-23 14:40:02.524 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 401
2025-09-23 14:40:12.792 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398
2025-09-23 14:40:12.816 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0
2025-09-23 14:40:24.342 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/session
2025-09-23 14:40:25.690 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 14:40:25.691 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 14:40:26.966 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398
2025-09-23 14:40:27.033 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0
2025-09-23 14:40:28.104 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398
2025-09-23 14:40:28.201 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 14:40:28.201 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 14:40:28.215 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats
2025-09-23 14:40:28.230 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest
2025-09-23 14:40:28.263 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 14:40:28.263 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 14:41:06.532 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 14:41:06.533 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 14:41:58.649 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10
2025-09-23 14:41:58.649 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'}
2025-09-23 14:42:06.096 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/21312
2025-09-23 14:42:06.098 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 401