跳转至

tortoise-orm

Tortoise ORM 是一个异步的 Python ORM(对象关系映射)库,支持 PostgreSQL、MySQL 和 SQLite 等数据库。虽然 Tortoise ORM 本身并不直接提供权限管理功能,但你可以基于它构建一个权限管理系统。以下是一个简单的权限管理系统的设计和实现思路。

1. 数据库设计

首先,我们需要设计数据库模型来存储用户、角色和权限信息。通常,权限管理系统会包含以下几个表:

  • User: 存储用户信息。
  • Role: 存储角色信息。
  • Permission: 存储权限信息。
  • UserRole: 用户和角色的多对多关系表。
  • RolePermission: 角色和权限的多对多关系表。
from tortoise import fields, models

class User(models.Model):
    id = fields.IntField(pk=True)
    username = fields.CharField(max_length=255, unique=True)
    password = fields.CharField(max_length=255)
    roles = fields.ManyToManyField("models.Role", related_name="users", through="user_role")

class Role(models.Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=255, unique=True)
    permissions = fields.ManyToManyField("models.Permission", related_name="roles", through="role_permission")

class Permission(models.Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=255, unique=True)
    code = fields.CharField(max_length=255, unique=True)

class UserRole(models.Model):
    user = fields.ForeignKeyField("models.User", related_name="user_roles")
    role = fields.ForeignKeyField("models.Role", related_name="role_users")

class RolePermission(models.Model):
    role = fields.ForeignKeyField("models.Role", related_name="role_permissions")
    permission = fields.ForeignKeyField("models.Permission", related_name="permission_roles")

2. 权限检查

在权限管理系统中,通常需要检查用户是否具有某个权限。我们可以通过以下步骤来实现:

  1. 获取用户的所有角色。
  2. 获取这些角色的所有权限。
  3. 检查所需的权限是否在这些权限列表中。
from tortoise.query_utils import Prefetch

async def has_permission(user: User, permission_code: str) -> bool:
    # 获取用户的所有角色
    user_with_roles = await User.filter(id=user.id).prefetch_related(
        Prefetch("roles", queryset=Role.all().prefetch_related("permissions"))
    ).first()

    # 获取所有权限
    permissions = set()
    for role in user_with_roles.roles:
        for permission in role.permissions:
            permissions.add(permission.code)

    # 检查权限
    return permission_code in permissions

3. 使用示例

假设我们有一个用户 user1,并且我们想检查他是否有 create_post 权限。

async def main():
    # 创建用户、角色和权限
    user = await User.create(username="user1", password="password")
    role = await Role.create(name="editor")
    permission = await Permission.create(name="Create Post", code="create_post")

    # 分配角色和权限
    await user.roles.add(role)
    await role.permissions.add(permission)

    # 检查权限
    if await has_permission(user, "create_post"):
        print("User has permission to create post")
    else:
        print("User does not have permission to create post")

# 运行异步函数
import asyncio
asyncio.run(main())

4. 扩展功能

  • 权限组: 可以将权限分组,方便管理。
  • 继承角色: 角色可以继承其他角色的权限。
  • 细粒度权限: 可以在权限中添加资源ID,实现更细粒度的权限控制。

5. 总结

通过 Tortoise ORM,我们可以轻松地构建一个灵活的权限管理系统。你可以根据实际需求扩展这个系统,例如添加更多的权限检查逻辑、实现角色继承、或者集成到现有的 Web 框架中(如 FastAPI 或 Django)。