我正在开发一个全栈项目,我需要处理具有多个角色的用户。在我当前的设置中,我有三个主要角色:客户、收件人(目的地)和管理员。我面临的挑战是一名用户可能同时拥有多个角色。例如,用户可能既是客户端又是接收者,甚至同时拥有所有三个角色(客户端、接收者和管理员)。 当前设置:
模型用户{ id Int @id @default(自动增量()) 名字字符串 姓氏字符串 电子邮件字符串@unique 电话号码字符串@unique 密码字符串? role Role @default(CLIENT) // Role 是一个枚举:CLIENT 或 ADMIN 创建于日期时间@default(now()) 更新日期时间@updatedAt }
枚举角色{ 客户 行政 } 问题: 单一角色限制:目前,我只能为每个用户分配一个角色。但是,我需要管理用户既可以是客户端又可以是收件人的场景(例如,某人发送包裹并同时接收包裹),或者他们也可以同时是管理员。 需要灵活性:我需要一个用户可以同时担任多个角色的系统,并且我需要一个可扩展的解决方案,因为系统将来可能会涉及新的角色。
我正在考虑的解决方案:
多对多关系:我正在考虑创建一个单独的角色模型并在用户和角色之间建立多对多关系,而不是在用户模型中使用单个角色字段。这将允许用户拥有多个角色(例如 CLIENT、ADMIN 和 DESTINATAIRE)。
这是使用 Prisma 的潜在解决方案:
模型用户{
id Int @id @default(自动增量())
名字字符串
姓氏字符串
电子邮件字符串@unique
电话号码字符串@unique
密码字符串?
创建于日期时间@default(now())
updatedAt 日期时间@updatedAt
角色 Role[] @relation("UserRoles")
}
模型角色 {
id Int @id @default(自动增量())
type RoleType @db.VarChar(50) // 具有 CLIENT、ADMIN、DESTINATAIRE 等值的枚举
用户 User[] @relation("UserRoles")
}
模型用户角色{
用户ID Int
角色 ID 整数
user 用户@relation(字段:[userId],引用:[id])
角色角色@relation(字段:[roleId],引用:[id])
@@id([userId, roleId]) // 多对多关系的复合键
}
枚举角色类型{
客户
管理员
目的地
}
论坛提问:
最佳实践:这种方法(使用用户和角色之间的多对多关系)是在基于 Prisma 的应用程序中处理多个角色的最佳方法吗?有什么陷阱或更好的选择吗?
角色验证:在处理请求时,如何有效地验证用户在后端是否具有特定的角色组合(例如 CLIENT 和 ADMIN)?
性能注意事项:在使用角色的多对多关系时,特别是在系统扩展时,是否有我应该注意的性能注意事项?
角色管理:如何顺利进行角色转换?例如,如果用户一开始是 DESTINATAIRE(收件人),后来成为 CLIENT,那么在不破坏现有功能(例如包裹跟踪)的情况下更新其角色的最佳方法是什么?
任何见解、建议或最佳实践将不胜感激!
多对多关系是最好的方法。在现代数据库中,即使您有数千个用户,这也不应该产生任何性能问题。
但是,如果你确定系统中只有3个角色,并且不会增加到4个或5个,你也可以按照类似于unix中的chmod命令的方式给出一个数值来指示角色。 客户端 -1,接收者 - 2,管理员 4。总计 7 表示所有 3 个角色,3 表示客户端+接收者,6 表示接收者+管理员,4 表示仅管理员等。