在现代Web开发中,权限管理是保证系统安全性的关键。FastAPI是一个现代、快速(高性能)的Web框架,用于构建API。本文将揭秘如何使用FastAPI结合Pydantic和SQLAlchemy来打造一个高效的后台管理系统,实现用户、角色与权限的控制。
一、项目结构设计
在开始之前,我们需要先设计好项目的目录结构。以下是一个简单的项目结构示例:
project/
│
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── models.py
│ ├── schemas.py
│ └── security.py
│
├── databases/
│ ├── __init__.py
│ └── engine.py
│
├── main.py
└── requirements.txt
二、依赖安装
首先,我们需要安装FastAPI、Pydantic、SQLAlchemy等依赖:
pip install fastapi uvicorn pydantic sqlalchemy
三、数据库设计
为了实现用户、角色与权限控制,我们需要设计三个数据库表:用户(User)、角色(Role)和权限(Permission)。
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from .base import Base
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, index=True)
username = Column(String, unique=True, index=True)
roles = relationship('Role', secondary='user_role', back_populates='users')
class Role(Base):
__tablename__ = 'roles'
id = Column(Integer, primary_key=True, index=True)
name = Column(String, unique=True, index=True)
permissions = relationship('Permission', secondary='role_permission', back_populates='roles')
users = relationship('User', secondary='user_role', back_populates='roles')
class Permission(Base):
__tablename__ = 'permissions'
id = Column(Integer, primary_key=True, index=True)
name = Column(String, unique=True, index=True)
roles = relationship('Role', secondary='role_permission', back_populates='permissions')
user_role = Table(
'user_role',
Base.metadata,
Column('user_id', Integer, ForeignKey('users.id')),
Column('role_id', Integer, ForeignKey('roles.id'))
)
role_permission = Table(
'role_permission',
Base.metadata,
Column('role_id', Integer, ForeignKey('roles.id')),
Column('permission_id', Integer, ForeignKey('permissions.id'))
)
四、Pydantic模型定义
接下来,我们需要定义Pydantic模型来验证和序列化数据。
from pydantic import BaseModel
from typing import Optional, List
class UserBase(BaseModel):
username: str
class UserCreate(UserBase):
password: str
class UserUpdate(UserBase):
password: Optional[str] = None
class RoleBase(BaseModel):
name: str
class RoleCreate(RoleBase):
pass
class RoleUpdate(RoleBase):
pass
class PermissionBase(BaseModel):
name: str
class PermissionCreate(PermissionBase):
pass
class PermissionUpdate(PermissionBase):
pass
五、安全模块设计
在FastAPI中,我们可以使用Security类来处理认证和授权。以下是一个简单的安全模块设计:
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
def get_current_user(token: str = Depends(oauth2_scheme)):
# 根据token获取当前用户
pass
def get_current_active_user(current_user: User = Depends(get_current_user)):
# 验证当前用户是否活跃
pass
六、API接口设计
以下是使用FastAPI创建的API接口示例:
from fastapi import FastAPI, Depends, HTTPException, status
from sqlalchemy.orm import Session
from . import models, schemas
app = FastAPI()
@app.post("/users/", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(SessionLocal)):
# 创建用户
pass
@app.post("/roles/", response_model=schemas.Role)
def create_role(role: schemas.RoleCreate, db: Session = Depends(SessionLocal)):
# 创建角色
pass
@app.post("/permissions/", response_model=schemas.Permission)
def create_permission(permission: schemas.PermissionCreate, db: Session = Depends(SessionLocal)):
# 创建权限
pass
@app.get("/users/me/", response_model=schemas.User)
def read_user_me(current_user: User = Depends(get_current_active_user)):
# 获取当前用户信息
pass
@app.get("/users/", response_model=list[schemas.User])
def read_users(skip: int = 0, limit: int = 10, db: Session = Depends(SessionLocal)):
# 获取用户列表
pass
@app.get("/roles/", response_model=list[schemas.Role])
def read_roles(skip: int = 0, limit: int = 10, db: Session = Depends(SessionLocal)):
# 获取角色列表
pass
@app.get("/permissions/", response_model=list[schemas.Permission])
def read_permissions(skip: int = 0, limit: int = 10, db: Session = Depends(SessionLocal)):
# 获取权限列表
pass
七、启动项目
最后,我们使用uvicorn启动项目:
uvicorn main:app --reload
现在,您已经成功使用FastAPI打造了一个高效的后台管理系统,实现了用户、角色与权限控制。希望本文对您有所帮助!
