permissions - 以角色為基礎的存取控制 - 權限設計模式,允許基於日期的訪問



role based access control design (1)

你的模型看起來不錯,但是...你正在重新發明輪子,就像你自己意識到的那樣,你的模型不夠靈活,不能滿足其他參數,比如時間。

在授權的歷史中,有一個傳統的,被廣泛接受的模型,稱為基於角色的訪問控制(RBAC)。 當你有一個明確定義的角色和這些角色之間的層次結構時,這個模型非常有效。

但是,如果層次結構不清晰或存在關係(如醫患關係)或存在動態屬性(如時間,地點,IP ...)時,RBAC將無法正常工作。 幾年前出現了一種叫做基於屬性的訪問控制(ABAC)的新模式。 從某種意義上說,這是RBAC的演變或泛化。 使用ABAC,您可以根據屬性定義授權邏輯。 屬性是一組描述用戶,操作,資源和上下文的鍵值對。 使用屬性,您可以描述任何數量的授權情況,例如:

  • 醫生可以在上午9點到下午5點之間查看患者的病歷,只有當患者被分配到該醫生時
  • 當且僅當患者與護士屬於同一診所時,護士才能編輯病人的病歷。

ABAC使得人們可以調用PBAC或基於策略的訪問控制,因為現在授權邏輯從專有代碼和數據庫方案轉移到一組集中管理的策略中。 這些政策的事實標準是XACML,即可擴展訪問控制標記語言。

簡而言之,XACML允許您以一種技術中立的方式,以一種分離的,外在的方式來做你正在尋找的東西。 這意味著,您可以定義一次授權,並在任何地方執行。

我建議你查看關於這個主題的很多資源:

我正在尋找在我的應用程序中實現授權(不認證)計劃的方法。

目前系統中有兩個角色:A和B,但可能還有更多。 用戶只有一個角色。

基本上,我現在設置的是兩個數據庫表。 一個是針對模型的基於角色的權限,另一個針對特定的基於用戶的權限。 我這樣想,用戶可以根據他們基於角色的權限擁有一組默認權限,但是他們也可以具有授予/撤銷的特定權限。

舉個例子:

table: user_permissions
columns:
    user_id: [int]
    action: [string]
    allowed: [boolean]
    model_id: [int]
    model_type: [string]

table: role_permissions
columns:
    role: [int]
    action: [string]
    model_type: [string]        

user_permissions表中, allowed字段指定是否allowed該操作,以便如果該值為0,則可以撤消該權限。

在另一個表中,我有每個行動的定義:

table: model_actions
columns:
    action: [string]
    bitvalue: [int]
    model_type: [string]

我這樣做,以便當我檢查模型的權限,例如['創建','刪除'],我可以使用按位和操作來比較用戶的權限,我正在檢查的權限。 例如,模型X可以具有以下model_actions:

action: 'create'
bitvalue: 4
model_type: X

action: 'delete'
bitvalue: 2
model_type: X

action: 'view'
bitvalue: 1
model_type: X

如果我的用戶/角色權限指定模型X的創建,查看和刪除操作分別為1,0和1,則基於model_actions表將其表示為110。 當我檢查是否可以創建模型X時,我使用create為4的事實來構造bitarray 100.如果110和100的按位AND操作是100,那麼權限是有效的。

無論如何,我想我有一個精細的權限設計模式。 如果不是,請隨時就這個問題進行教育。

我的問題的實際重點是以下幾點:

我的一些模型有時間依賴的行為。 例如,您只能在created_at日期後不超過24小時的時間內刪除模型Y.

我在想的是在創建模型時自動創建一個cron作業,以便在發生這種情況的日期更新權限。 在模型Y的情況下,我想插入一個記錄到user_permissions撤銷這個模型的“刪除”行為。

我的問題是:這是可取的嗎?

編輯

如果我在SQL表中包含另一行,指定了“翻轉”(flipDate)權限的日期? 如果定義了翻轉日期,並且當前日期在翻轉日期之後,則權限被反轉。 這似乎比一系列cron作業更容易管理,尤其是在可能更新模型時。