【问题标题】:Returning the results only when the user has permissions仅当用户有权限时才返回结果
【发布时间】:2012-11-28 02:32:22
【问题描述】:

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

我有Books 的列表。只有分配给这本书的用户才能看到其中的书籍和其他内容。它基本上是 API 调用。 /Books//Books/Chapters//Books/Chapters/Pages/等。权限附加到数据库中的Books条目。

Books、'Chapters,Pages`等都在不同的表中。 用户权限存储在不同的表中。表是这样的。

    UserID,  BookID
    --------------
     101      1
     102      1
     102      2
     ... 

从 API 调用本身获取用户信息(基本身份验证)。 如果请求的Book 存在,API 应该返回401 Unauthorized,但用户没有对该Book 的权限。如果请求的“Bookdoes not exist, then it should return404 Not found”。

通常,首先我需要通过查询检查该用户和请求的Book 的权限。如果该用户的用户权限表中存在该记录,那么我应该运行另一个查询以获取Book、'Chapter` 等。

目前,我正在将这两个查询与权限表中的“WHERE EXISTScondition that checks for the existence of the record for this user for the requestedBook”结合起来。所以只有在用户权限表中有记录时才会返回记录。

但是有了这个,我不知道Book是否不存在或者用户没有权限,尽管我可以减少一个数据库调用来单独检查用户权限。有了这个,我无法区分401404

有没有更好的方法来做到这一点,同时能够通过单个查询区分 401404? 还是最好进行两次数据库调用?

你的想法?

【问题讨论】:

    标签: mysql permissions


    【解决方案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>
    

    您将有一个名为“Permission”的新列,如果用户有权限,则该列为 1,如果用户没有该书的权限,则为 NULL。

    编辑:我简化了子查询,让它返回“1”或“NULL”。

    【讨论】:

    • 那么您的查询将返回结果以及用户权限?我猜它会返回结果(如果存在),即使用户没有权限也是如此。但不是 1,而是返回 null?
    • @Kevin:没错。始终返回图书的结果(如果存在)。用户访问权限的确定基于新 Permission 列的值(1 或 NULL)。
    【解决方案2】:

    您需要拥有您的应用程序 ACL(访问控制列表),这样您就可以将权限分配给数据库中的各种实体。看看this question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2021-03-15
      • 2023-03-21
      • 2020-08-11
      • 2021-12-25
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多