仅在用户具有权限时返回结果

时间:2012-11-27 18:24:17

标签: mysql permissions

我想知道是否有更好的方法来处理这种情况。虽然,它的简单,保持点击次数,我试图消除一个查询。

我有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不存在或者用户没有权限,虽然我可以减少一个数据库调用以分别检查用户权限。有了这个,我无法区分401404

是否有更好的方法可以将401404与单个查询区分开来? 或者它最好做两个数据库调用?

你的想法?

2 个答案:

答案 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