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. 权限检查
在权限管理系统中,通常需要检查用户是否具有某个权限。我们可以通过以下步骤来实现:
- 获取用户的所有角色。
- 获取这些角色的所有权限。
- 检查所需的权限是否在这些权限列表中。
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)。