自訂沙盒:限制欄位的存取權

了解如何使用已儲存的 SQL 查詢,針對不同人員顯示特定的列和欄位。

沙盒功能在 Pro 和 Enterprise 方案中提供,可用於根據人員身分指定人員可以存取的資料。我們關於列權限的文章涵蓋如何建立基本沙盒,以根據人員的使用者屬性限制列。例如,我們建立了一位 Brown 女士的使用者,並授予她存取權限,以存取 PeopleOrders 表格中與她的 user_id 屬性相符的列。

在本文中,我們將逐步說明如何為 Products 表格建立自訂沙盒,以限制 Brown 女士可以檢視的列和欄位。在本例中,我們希望 Brown 女士

  • 僅在 Products 表格中看到她已下訂單的產品。
  • 僅看到 TitleCategoryPrice 欄位(以及任何其他欄位)。

計畫

我們將

  1. 建立只有管理員可以存取的集合。

  2. 建立新的 SQL 查詢。Products 表格不包含關於使用者的資訊。因此,為了限制 Brown 女士對 Products 表格的存取權,我們需要找出 Brown 女士訂購了哪些產品。我們將撰寫一個 SQL 查詢,將 Products 表格中的資料與 Orders 表格中的資料結合。在結合這些表格時,我們將建立一個新的表格結果,其中僅包含我們想要的欄位。

  3. Product 表格進行沙盒處理,方法是顯示我們查詢的結果,而不是 Brown 女士的原始表格。

  4. 透過驗證 Brown 女士可以看到哪些資料,確認我們的沙盒。

建立只有管理員可以存取的集合

我們會想要建立一個集合來儲存我們將用來沙盒處理此表格的 SQL 查詢。我們將其命名為 Sandbox Questions,並在此集合上設定權限,以便只有管理員可以管理其問題。這樣,非管理員將無法變更問題並變更沙盒的「維度」,例如,透過包含 Brown 女士不應看到的欄位。請參閱集合權限以深入了解如何設定權限。

建立 SQL 查詢

從頂端列中,按一下 + 新增 > SQL 查詢提出 SQL 問題。選取 Metabase 隨附的範例資料庫

以下是我們將貼到編輯器中的查詢

SELECT DISTINCT PRODUCTS.TITLE,
                PRODUCTS.CATEGORY,
                PRODUCTS.PRICE
FROM PRODUCTS
     LEFT JOIN ORDERS ON ORDERS.PRODUCT_ID=PRODUCTS.ID
[[WHERE ORDERS.USER_ID IN ({{sandbox}})]]

以下是查詢的作用

  • 傳回包含 Products 表格中欄位的結果:TitleCategoryPrice
  • 檢查產品是否相異,亦即每個產品只有一列。
  • 選擇性地篩選此清單,僅顯示沙盒使用者訂購的產品。

雙方括號 [[…]] 圍繞 WHERE 子句使子句成為選用項目。雙大括號 {{sandbox}} 定義變數。當我們沙盒處理此問題時,我們將使用此 {{sandbox}} 變數。

讓我們執行查詢,這會產生此結果

SQL query to create new table.

現在讓我們將此問題儲存為 Products from Orders,將其儲存在我們建立的 Sandbox Questions 集合中,並選擇不將問題新增至儀表板。

這裡要重申一點:我們僅選取了 Products 表格中的欄位,因為我們的查詢應僅傳回我們想要沙盒處理的表格中的欄位。

使用我們儲存的問題沙盒處理 Products 表格

現在我們已建立 Products from Orders 問題,現在是時候沙盒處理 Products 表格了。我們將設定沙盒,以便 Metabase 將我們在關於列權限的文章中提供給 Brown 女士的 user_id 屬性插入到我們已儲存的 SQL 問題 Products from Orders 中的 {{sandbox}} 變數中。

我們將按一下齒輪圖示,選取管理設定,然後按一下權限標籤。在左側的資料庫下方,我們將按一下 Sample DatabaseProducts。由於 Brown 女士是 Customers 群組的成員,且 Metabase 將資料權限授予群組,而非個人,因此我們將授予 Customers 沙盒存取 Products 表格的權限。

Granting the Customer group sandboxed access to the Products table.

當 Metabase 彈出沙盒處理模式時,在「您要如何為此群組中的使用者篩選此表格?」區段中,我們將選取第二個篩選選項:「使用已儲存的問題為此表格建立自訂檢視」。

我們將導覽至僅限管理員的 Sandbox Questions 集合,並選取我們的問題 Products from Orders。針對 PARAMETER OR VARIABLE,我們將選取我們包含在 SQL 查詢中的變數 {{sandbox}}。針對 USER ATTRIBUTE,我們將選取 user_id

The sandboxing modal summarizes the effects of our selection.

我們的摘要現在顯示

  • Customers 群組中的人員
  • 可以檢視 Products from Orders 問題中的列
  • 其中 sandbox 變數的值等於 user_id

讓我們按一下模式中的儲存,然後按一下通知列中的儲存變更以確認我們的變更。

以沙盒使用者身分檢查設定

讓我們從 Brown 女士的角度看看我們的沙盒 Products 表格的外觀。開啟私密瀏覽器視窗,導覽至我們的 Metabase,並以 Brown 女士身分登入。

當我們使用資料瀏覽器開啟 Products 表格時,我們可以確認 Brown 女士只能看到她訂購的產品清單,以及我們包含在已儲存的 Products from Orders 問題中的三個欄位:TitleCategoryPrice

The Products table from the Metabase home page only showing products that Ms. Brown has ordered.

如果 Brown 女士提出查詢 Products 表格的問題,她仍然只會看到根據她訂購的產品的結果。如果她有權存取包含沙盒外部欄位的問題,她會看到錯誤。

沙盒處理表格時,偏好使用 SQL 問題

雖然我們可以使用查詢產生器問題來沙盒處理表格,但我們建議改為使用 SQL 問題。在幕後,問題會根據我們問題中的篩選器摘要聯結建立 SQL 查詢。當我們根據 GUI 問題進行沙盒處理時,我們可能不會意識到我們給予人員存取權限的資訊的完整範圍。

或者,我們可以使用查詢產生器建立問題,然後查看幕後,以查看 Metabase 將執行的 SQL 程式碼。在查詢產生器中,我們可以按一下右上角的檢視 SQL 按鈕,以確認 Metabase 是否包含正確的表格和欄位,以及其他任何內容。

重點回顧

使用問題進行沙盒處理時

  • 使用 SQL 問題.
  • 請確定您已儲存的 SQL 問題僅傳回您打算沙盒處理的表格中的欄位。
  • 將沙盒處理問題儲存在僅限管理員的集合中,最好是專門用於沙盒處理問題的集合。

延伸閱讀

下一步:資料沙盒:個人化人員可以在 Metabase 中看到的資料

將沙盒與使用者屬性配對,以針對幾乎任何情況自訂資料。

下一篇文章