Skip to content

Commit c7eff65

Browse files
authored
Merge pull request #116 from BUAA-SE-coders007/fix/112
[fix]: 增加权限控制
2 parents 76a8357 + f4897b4 commit c7eff65

File tree

4 files changed

+41
-15
lines changed

4 files changed

+41
-15
lines changed

app/api/v1/endpoints/article.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,16 @@ async def upload_to_self_folder(folder_id: int = Query(...), article: UploadFile
4343
@router.get("/getSelfFolders", response_model="dict")
4444
async def get_self_folders(page_number: Optional[int] = Query(None, ge=1), page_size: Optional[int] = Query(None, ge=1),
4545
db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)):
46-
# 获取用户id
4746
user_id = user.get("id")
48-
4947
total_num, folders = await crud_get_self_folders(user_id, page_number, page_size, db)
5048
result = [{"folder_id": folder.id, "folder_name": folder.name} for folder in folders]
5149
return {"total_num": total_num, "result": result}
5250

5351
@router.get("/getArticlesInFolder", response_model="dict")
5452
async def get_articles_in_folder(folder_id: int = Query(...), page_number: Optional[int] = Query(None, ge=1), page_size: Optional[int] = Query(None, ge=1),
55-
db: AsyncSession = Depends(get_db)):
56-
total_num, articles = await crud_get_articles_in_folder(folder_id, page_number, page_size, db)
53+
db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)):
54+
user_id = user.get("id")
55+
total_num, articles = await crud_get_articles_in_folder(user_id, folder_id, page_number, page_size, db)
5756
result = [{"article_id": article.id, "article_name": article.name} for article in articles]
5857
return {"total_num": total_num, "result": result}
5958

@@ -134,8 +133,9 @@ async def import_self_folder(folder_name: str = Query(...), zip: UploadFile = Fi
134133
return {"msg": "Successfully import articles"}
135134

136135
@router.get("/exportSelfFolder", response_class=FileResponse)
137-
async def export_self_folder(background_tasks: BackgroundTasks, folder_id: int = Query(...), db: AsyncSession = Depends(get_db)):
138-
zip_name, article_ids, article_names, article_urls = await crud_export_self_folder(folder_id, db)
136+
async def export_self_folder(background_tasks: BackgroundTasks, folder_id: int = Query(...), db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)):
137+
user_id = user.get("id")
138+
zip_name, article_ids, article_names, article_urls = await crud_export_self_folder(folder_id, user_id, db)
139139

140140
tmp_dir = tempfile.gettempdir()
141141
zip_path = os.path.join(tmp_dir, f"{zip_name}.zip")

app/api/v1/endpoints/group.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,15 @@ async def leave_group(model: LeaveGroup, db: AsyncSession = Depends(get_db), use
108108
return {"msg": "You successfully left the group"}
109109

110110
@router.get("/getBasicInfo", response_model=dict)
111-
async def get_basic_info(group_id: int = Query(...), db: AsyncSession = Depends(get_db)):
112-
name, desc, avatar, time = await crud_get_basic_info(group_id, db)
111+
async def get_basic_info(group_id: int = Query(...), db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)):
112+
user_id = user.get("id")
113+
name, desc, avatar, time = await crud_get_basic_info(group_id, user_id, db)
113114
return {"avatar": avatar, "name": name, "desc": desc, "time": time}
114115

115116
@router.get("/getPeopleInfo", response_model=dict)
116-
async def get_people_info(group_id: int = Query(...), db: AsyncSession = Depends(get_db)):
117-
leader, admins, members = await crud_get_people_info(group_id, db)
117+
async def get_people_info(group_id: int = Query(...), db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)):
118+
user_id = user.get("id")
119+
leader, admins, members = await crud_get_people_info(group_id, user_id, db)
118120
return {"leader": leader, "admins": admins, "members": members}
119121

120122
@router.get("/getMyLevel", response_model=dict)

app/curd/article.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,14 @@ async def crud_get_self_folders(user_id: int, page_number: int, page_size: int,
2929

3030
return total_num, folders
3131

32-
async def crud_get_articles_in_folder(folder_id: int, page_number: int, page_size: int, db: AsyncSession):
32+
async def crud_get_articles_in_folder(user_id: int, folder_id: int, page_number: int, page_size: int, db: AsyncSession):
33+
# 先检查权限
34+
query = select(Folder).where(Folder.id == folder_id)
35+
result = await db.execute(query)
36+
folder = result.scalar_one_or_none()
37+
if folder.user_id != user_id:
38+
raise HTTPException(status_code=405, detail="You have no access to it")
39+
# 查找
3340
query = select(Article).where(Article.folder_id == folder_id, Article.visible == True).order_by(Article.id.desc())
3441
count_query = select(func.count()).select_from(query.subquery())
3542
count_result = await db.execute(count_query)
@@ -151,12 +158,16 @@ async def crud_import_self_folder(folder_name: str, article_names, urls, user_id
151158
for new_article in new_articles:
152159
await db.refresh(new_article)
153160

154-
async def crud_export_self_folder(folder_id: int, db: AsyncSession):
161+
async def crud_export_self_folder(folder_id: int, user_id: int, db: AsyncSession):
162+
# 权限检查
155163
query = select(Folder).where(Folder.id == folder_id)
156164
result = await db.execute(query)
157165
folder = result.scalar_one_or_none()
166+
if folder.user_id != user_id:
167+
raise HTTPException(status_code=405, detail="You have no access to it")
168+
# 文件夹名
158169
folder_name = folder.name
159-
170+
#文献
160171
query = select(Article).where(Article.folder_id == folder_id, Article.visible == True).order_by(Article.id.desc())
161172
result = await db.execute(query)
162173
articles = result.scalars().all()

app/curd/group.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,26 @@ async def crud_leave_group(group_id: int, user_id: int, db: AsyncSession):
118118
await db.execute(query)
119119
await db.commit()
120120

121-
async def crud_get_basic_info(group_id: int, db: AsyncSession):
121+
async def crud_get_basic_info(group_id: int, user_id: int, db: AsyncSession):
122+
# 检查是否在组织中
123+
query = select(user_group).where(user_group.c.user_id == user_id, user_group.c.group_id == group_id)
124+
result = await db.execute(query)
125+
relation = result.first()
126+
if not relation:
127+
raise HTTPException(status_code=405, detail="You have no access to it")
128+
# 查询基本信息
122129
query = select(Group.name, Group.description, Group.avatar, Group.create_time).where(Group.id == group_id)
123130
result = await db.execute(query)
124131
group = result.first()
125132
return group.name, group.description, group.avatar, group.create_time
126133

127-
async def crud_get_people_info(group_id: int, db: AsyncSession):
134+
async def crud_get_people_info(group_id: int, user_id: int, db: AsyncSession):
135+
# 检查是否在组织中
136+
query = select(user_group).where(user_group.c.user_id == user_id, user_group.c.group_id == group_id)
137+
result = await db.execute(query)
138+
relation = result.first()
139+
if not relation:
140+
raise HTTPException(status_code=405, detail="You have no access to it")
128141
# 创建者信息
129142
query = select(Group.leader).where(Group.id == group_id)
130143
result = await db.execute(query)

0 commit comments

Comments
 (0)