使用 Prisma 检查对象所有权

问题描述

我是 prisma 的新手。我不清楚的一个方面是检查用户是否拥有对象权限的正确方法。假设我们有 BookAuthor 模型。每本书都有一个作者(一对多)。只有作者有权删除图书。

强制执行此操作的一种简单方法是:

prismaClient.book.deleteMany({
    id: bookId,<-- id is kNown
    author: {
        id: userId <-- id is kNown
    }
})

但是这种方式很难向用户显示 UnauthorizedError。相反,响应将是 500 状态代码,因为我们无法知道查询失败的确切原因。

另一种方法是先查询图书并检查图书实例的作者,这将导致再进行一次查询

prisma 中是否有最佳实践?

解决方法

假设您使用的是 PostgreSQL,最好的方法是使用行级安全性 (RLS) - 但不幸的是,Prisma 尚未正式支持它。 这里有关于这个主题的讨论 https://github.com/prisma/prisma/issues/5128

就目前的情况而言,我认为最好使用额外的查询并向用户提供信息反馈,而不是使用您建议的其他方法而不知道为什么没有删除。

最终,取决于您的用例 - 了解失败的原因对您来说是否重要。