2012-05-08 21 views
6

我正在實施內部網站點的訪問控制。如果公司幾乎沒有200多名員工和自定義權限,那麼這很容易。我知道這是瘋狂的,但我無法改變它。因此,我試圖找到一個滿足我的需求的通用實現,但找不到它,所以我自己去做。最後,我提出了一個相當通用的解決方案,讓我思考:以前必須做到這一點!是否有基於規則的訪問控制的簡單通用實現?

我稱之爲STOP(主題任務對象權限)訪問控制。我有以下關係:

.-------.  .-----------.  .-------. 
| users |1---*| STOPRules |*---1| tasks | 
`-------'  '-----------'  '-------' 

甲STOP規則具有以下屬性

STOPRule { 
    Subject; 
    Task; 
    ObjectType; 
    Permission; 
    Relation; 
} 

對象關係可以是:所有者,創建者,反向器等,則不需要此字段,以支持通用任務。當它在那裏時,當前用戶和對象實例之間的關係由委託來計算。然後將當前關係與規則上的所需關係進行比較以允許或拒絕訪問。

如果我不夠清楚,請告訴我。

出現了兩個問題:

  1. 有這樣一個開源實現?

  2. 您是否看到我遇到此路徑後遇到的任何問題?

編輯:我繼續實際上開始實施這一模式。第一個問題是我需要主題和對象之間的關係來支持任何用例。現在,我可以存儲以下規則:

約翰(主題)可以的(許可)編輯(任務)的爲了(對象),如果他是創造者(關係)訂購。

請你們能提供一個不能用這個模型表達的REALISTIC用例嗎?

+2

+1爲「辦公空間」類型的氣氛 - 你可能都會填寫tps報告。 – JonH

+0

作爲您的模型設計的一部分,[基於角色的訪問控制](http://en.wikipedia.org/wiki/Role-based_access_control)是否聽起來像它適合模型明智的賬單?你的標題如此接近我想知道這是你最初的意思。 – 2012-05-08 18:28:54

+0

@Ninefingers不,不幸的是,它不是。基於rOle的交流和基於交流的交流共享相同的縮寫,但不同,我的意思是第二個。在基於規則的交流中,訪問規則在要保護的對象(或資源)中定義(從操作系統視圖來講),使其適應Web,最近我看到的是Zend_Acl在Zend上的ACL實現框架,但它期望我加載所有的權限,因爲它是rOle而不是基於rUle的,它假定它將少許許可規則。 – svallory

回答

1

實際上有一個表具有某些角色的分組權限,並使用另一個表來擴展權限以覆蓋一般角色。如果是隻讓約翰訪問的東西的話,爲什麼還要提到對方不可以?就像你在上面評論中提供的最後一個例子一樣:是否有一個具有權限的表。記錄如下所示:1645 edit_some_field。然後group_permissions看起來像:1645 everyone false和最終的異常表將是1645 (Jane Doe's ID) true

如果,假設有50個人誰有權修改這一領域,那麼你只需要添加另一組分組表所示:89 editors_of_field_X,把人民羣衆的ID添加到表group_members89 (John Smith's ID) true。然後在最後一步,您可以像上面提到的那樣用單人權限覆蓋那些人。所以最後你會有3層方案。每個人組人。你越深入,這個角色的重要性就越高。例如,如果每個人都不被允許,但是你所在的組是允許的,那麼你可以編輯一些東西。

此外,如果您不允許第三方訪問權限,那麼您又成爲組中的例外。通過這種方式,您可以稍後重複使用組,僅添加較小的更改。

+0

如果一個人是兩個組的成員,而一個人被允許編輯而另一個人不是? – wchargin

+0

好點。但是這個問題的作者可以決定:不允許,不允許或者檢查最新的問題。 –

+0

嗨,@AndriusNaruševičius,感謝您花時間回答這麼多細節。由於項目已經截止(自從我問了20天后),所以我繼續實施我描述的模型。那麼,有點兒。我做了一些改進。例如。在定義與對象的關係時定義用戶沒有意義。我會寫一些關於我想到的內容,並在稍後發佈。至於你的答案,我會在稍後評論,但你基本上描述了基於rOle的訪問控制是如何工作的。 – svallory

1

約翰創建了一個命令,並希望讓鮑勃查看它。

+0

您可以在某處保存bob被邀請查看該順序的位置(因此係統可以在運行時評估「邀請」關係,就像它對任何關係一樣)並添加STOPRules(用戶,任務,對象類型,權限,關係)值(null,「view」,「order」,「allow」,「invite」)。 我得出的結論是,設置用戶只對異常有用。不錯的例子,但! – svallory

相關問題