2012-11-27 60 views
0

我想知道是否有更好的方法來處理這種情況。雖然,它簡單,記住點擊次數,我試圖消除查詢。只有當用戶有權限時才返回結果

我有Books的列表。只有分配給本書的用戶才能看到其中的書籍和其他內容。它基本上是API調用。 /Books/,/Books/Chapters/,/Books/Chapters/Pages/等。權限被附加到數據庫中的Books條目。

Books,'章節, Pages`等都在不同的表格中。 用戶權限存儲在不同的表中。桌子是這樣的。

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

用戶信息從API調用本身抓取(基本身份驗證)。 如果請求的Book存在,但該用戶沒有對該Book的權限,則API應返回401 Unauthorized。如果請求的'書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一個單一的查詢? 或者更好地做兩個數據庫調用?

您的想法?

回答

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> 

你有一個名爲「許可」,這將是1,如果用戶擁有權限或NULL,如果用戶沒有權限書新列。

編輯:我通過讓它返回「1」或「NULL」來簡化子查詢。

+0

因此,您的查詢返回結果以及用戶權限?我想如果存在的話,即使用戶沒有權限,它也會返回結果。但是,而不是1,它只是返回null? –

+1

@凱文:沒錯。本書的結果(如果存在)總是返回。用戶訪問的確定取決於新權限列(1或NULL)的值。 –

0

您需要擁有您的應用程序ACL(訪問控制列表)通過這種方式,您可以將權限分配給數據庫中的各種實體。看看this question

相關問題