我想知道是否有更好的方法来处理这种情况。虽然,它的简单,保持点击次数,我试图消除一个查询。
我有Books
的列表。只有分配到本书的用户才能看到书籍和其他内容。它基本上是API调用。 /Books/
,/Books/Chapters/
,/Books/Chapters/Pages/
等。权限附加到数据库中的Books
条目。
Books
,'章节,
页面“等都在不同的表格中。
用户权限存储在不同的表中。表就是这样的。
UserID, BookID
--------------
101 1
102 1
102 2
...
从API调用本身(Basic Auth)中获取用户信息。
如果请求的401 Unauthorized
存在,则API应返回Book
,但该用户没有Book
的权限。如果请求的“预订does not exist, then it should return
404未找到”。
通常,首先我需要通过查询检查该用户和所请求的Book
的权限。如果该用户的用户权限表中存在该记录,那么我应该运行另一个查询来获取Book
,'Chapter`等。
目前,我正在使用权限表中的'WHERE EXISTS condition that checks for the existence of the record for this user for the requested
Book`来梳理这两个查询。因此,只有在用户权限表中有记录时才会返回记录。
但有了这个,我不知道,如果Book
不存在或者用户没有权限,虽然我可以减少一个数据库调用以分别检查用户权限。有了这个,我无法区分401
和404
。
是否有更好的方法可以将401
和404
与单个查询区分开来?
或者它最好做两个数据库调用?
你的想法?
答案 0 :(得分:1)
我建议你嵌入这样的子查询。
SELECT
(SELECT
1
FROM
permissions
WHERE
permissions.user_id=<user ID> AND permissions.book_id=<book ID>)
) AS Permission,
*
FROM
books
WHERE
books.id=<book ID>
您将拥有一个名为&#34; Permission&#34;如果用户有权限则为1;如果用户没有权限,则为NULL。
编辑:我简化了子查询,让它返回&#34; 1&#34;或&#34; NULL&#34;。
答案 1 :(得分:0)
您需要拥有应用程序ACL(访问控制列表)这样您就可以为数据库中的各种实体分配权限。看看this question