BookSystem/backend/auth/apps/permissions/urls.py
jayhgq a3206bb0f6 feat(auth): 添加权限管理功能
实现权限管理模块,包括:
1. 权限模型、路由和中间件
2. 角色权限多对多关联
3. 权限验证中间件
4. 初始化权限数据
5. 权限管理API接口
2026-04-29 17:59:41 +08:00

173 lines
5.5 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from fastcrud import FastCRUD
from database import get_db
from models import Permission, Role
from schemas import (
PermissionCreate,
PermissionResponse,
RolePermissionAssign,
RolePermissionResponse,
)
from middleware import get_current_user
from models import User
router = APIRouter(prefix="/permissions", tags=["permissions"])
# 创建FastCRUD实例
permission_crud = FastCRUD(Permission, PermissionResponse)
@router.post("/", response_model=PermissionResponse)
async def create_permission(
permission_data: PermissionCreate,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""创建权限"""
# 检查权限编码是否已存在
result = await db.execute(select(Permission).filter(Permission.code == permission_data.code))
existing_permission = result.scalar_one_or_none()
if existing_permission:
raise HTTPException(status_code=400, detail="权限编码已存在")
# 创建权限实例
db_permission = Permission(
name=permission_data.name,
code=permission_data.code,
description=permission_data.description,
)
db.add(db_permission)
await db.commit()
await db.refresh(db_permission)
return db_permission
@router.get("/", response_model=list[PermissionResponse])
async def get_permissions(
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""获取所有权限"""
result = await db.execute(select(Permission))
permissions = result.scalars().all()
return permissions
@router.get("/{permission_id}", response_model=PermissionResponse)
async def get_permission(
permission_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""获取单个权限"""
permission = await permission_crud.get(db, id=permission_id)
if not permission:
raise HTTPException(status_code=404, detail="权限不存在")
return permission
@router.put("/{permission_id}", response_model=PermissionResponse)
async def update_permission(
permission_id: int,
permission_data: PermissionCreate,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""更新权限"""
# 检查权限编码是否被其他权限使用
result = await db.execute(
select(Permission).filter(Permission.code == permission_data.code, Permission.id != permission_id)
)
existing_permission = result.scalar_one_or_none()
if existing_permission:
raise HTTPException(status_code=400, detail="权限编码已存在")
# 准备更新数据
update_data = permission_data.model_dump()
# 使用FastCRUD更新权限
updated_permission = await permission_crud.update(
db, update_data, id=permission_id, schema_to_select=PermissionResponse, return_as_model=True
)
if not updated_permission:
raise HTTPException(status_code=404, detail="权限不存在")
return updated_permission
@router.delete("/{permission_id}")
async def delete_permission(
permission_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""删除权限"""
# 检查权限是否存在
result = await db.execute(select(Permission).filter(Permission.id == permission_id))
existing_permission = result.scalar_one_or_none()
if not existing_permission:
raise HTTPException(status_code=404, detail="权限不存在")
# 使用FastCRUD删除权限
deleted = await permission_crud.delete(db, id=permission_id)
return {"message": "权限删除成功"}
# 角色权限关联接口
@router.post("/assign", response_model=RolePermissionResponse)
async def assign_permissions_to_role(
data: RolePermissionAssign,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""为角色分配权限"""
# 查找角色
result = await db.execute(select(Role).filter(Role.id == data.role_id))
role = result.scalar_one_or_none()
if not role:
raise HTTPException(status_code=404, detail="角色不存在")
# 查找要分配的权限
permissions = []
for permission_id in data.permission_ids:
result = await db.execute(select(Permission).filter(Permission.id == permission_id))
permission = result.scalar_one_or_none()
if permission:
permissions.append(permission)
# 更新角色的权限
role.permissions = permissions
await db.commit()
await db.refresh(role)
# 返回角色权限信息
return RolePermissionResponse(
role_id=role.id,
role_name=role.name,
permissions=[PermissionResponse.from_orm(p) for p in role.permissions]
)
@router.get("/role/{role_id}", response_model=RolePermissionResponse)
async def get_role_permissions(
role_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""获取角色的权限列表"""
# 查找角色
result = await db.execute(select(Role).filter(Role.id == role_id))
role = result.scalar_one_or_none()
if not role:
raise HTTPException(status_code=404, detail="角色不存在")
# 返回角色权限信息
return RolePermissionResponse(
role_id=role.id,
role_name=role.name,
permissions=[PermissionResponse.from_orm(p) for p in role.permissions]
)