簡體   English   中英

在 MongoDB 中建模訪問控制

[英]Modelling Access Control in MongoDB

有沒有人有在 MongoDB 中建模訪問控制的例子? 我想到的情況是:

有一組資源,每個資源都是它們自己的文檔(例如汽車、人、樹等)。

用戶可以通過顯式授權獲得對資源的訪問權限,或者通過成為存在於另一個集合(例如角色)中的資源的所有者或某些其他隱式方式隱式地獲得訪問權限。

在一個 collection.find() 方法中,可以應用跳過和限制選項(用於分頁),有沒有辦法檢查所有這些顯式和隱式路徑並生成用戶有權訪問的資源的結果?

在 MySQL 中,我們使用帶有資源 ID、授予用戶 ID、授權用戶 ID 和操作(讀取、寫入等)的授權表對此進行了建模。 然后,在一個查詢中,選擇至少一個子查詢為真的所有資源,然后子查詢檢查所有不同的訪問路徑,例如一個檢查授權,一個檢查所有權等。

我只是無法在 MongoDB 中做到這一點,我不確定這是否可能......

謝謝

一次不能查詢多個文檔。 理想情況下,訪問控制不應成為業務邏輯的一部分。 您的后端 php/c#/language 應該確保當前請求已獲得授權。 如果是這樣,那么只需查詢請求的文檔。

如果您覺得需要在 mongodb 中實現完全相同的結構,我建議您不要,那么您將需要嵌入所有這些字段(來自其他 mysql 表的字段,可幫助您識別請求是否已授權)在每個集合的每個文檔中。 您將復制數據(對其進行非規范化)。 這帶來了確保所有副本都更新並具有相同值的頭痛。

編輯1:

讓我們談談汽車文件。 要跟蹤其所有者,您將擁有owner屬性(這將包含所有者文檔的_id )。 要跟蹤所有可以“使用”(顯式授予)汽車的用戶,您將擁有一個數組allowerdDrivers (這將包含每個user文檔的_id )。 讓我們假設發出請求的當前用戶屬於“管理員”角色。 user文檔將有一個applicableRoles角色數組, applicableRoles存儲每個適用角色文檔的_id

要檢索用戶有權訪問的所有汽車,您只需進行兩次查詢。 一個來獲取他的角色。 如果他是管理員,請歸還所有汽車。 如果他不是,則進行另一個查詢,其中owner等於他的 id or allowedDrivers包含他的 id。

我知道您的實際用例可能更復雜,但有可能有一種面向文檔的方法來解決這個問題。 您必須意識到,在文檔中對數據建模的方式與在 RDbMS 中對其建模的方式大不相同。

在業務邏輯中這樣做會非常緩慢且效率低下。

為何如此? 這是業務邏輯,如果用戶 a 擁有帖子 b,則讓他們執行操作(MVC 樣式),否則不執行。

對我來說這聽起來像是業務邏輯,大多數框架都認為這個業務邏輯被放置在控制器操作中(MVC 范式); 即在 PHP Yii 中:

Yii::app()->roles->hasAccess('some_view_action_for_a_post', $post)

我認為通過在數據庫端執行此操作,您將存儲層與業務層混淆了。

此外,某些基於角色的權限操作可以獲得您提交的查詢的復雜程度,並且必須有很多子選擇。 考慮到 MySQL 如何創建和處理結果集(子選擇不是聯接),我覺得這些查詢的擴展性不是特別好。

此外,您還必須考慮何時更改角色或定義角色的函數,該函數可以訪問某個對象,您必須直接更改 SQL 查詢,而不僅僅是將角色添加到角色表並分配對象該角色的屬性並為用戶分配該角色(AKA 代碼更改)。

所以我會認真研究其他語言(和你自己的)的其他框架如何做他們的 RBAC 因為我認為你已經模糊了界限並且你所做的事情讓你的生活變得很艱難,事實上這里可能是一個很好的起點: node.js 和 express.js 中基於組/規則的授權方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM