2010-08-29 40 views
2

我們一直在重構我們的基於Web的管理應用程序(再次),並且在描述涉及我們用於調用CRUD(create-read-update-delete)操作的權限時有點卡住。我們發現,簡單地試圖描述CRUD方面的行動/許可並不適用於網絡應用程序。看來,CRUD作爲一個概念被分割在數據的範圍 - 無論是在數據庫和應用模型:在Web應用程序中描述CRUD的更好方法?

Scope Permissions    Example 
----- -----------    ------- 
Table READ      I can view a list of all orders 
Row  READ | CREATE | DELETE I can view an individual product, I can create a new product and I can delete it from the database 
Field READ | UPDATE    I can view and update a customer's username 

我們正在努力想出了一個簡潔的權限表,而不範圍混淆。例如,如果我想創建一個新產品,那麼我必須有權讀取產品表,讀取並創建產品行,並且還具有對產品名稱字段的讀取和更新訪問權限......所有這些都添加到一個非常凌亂的權限樹!目前,我們有各種各樣的愚蠢的方法,如hasAccess($object, $user_ID),並在if/else語句中嵌套'n'級以適應上述情況。

是否有其他衆所周知的方式來描述用戶權限而不訴諸於CRUD?

感謝您的幫助!

(而且,我可以告訴大家,是的,我們已經看過很多框架,看看他們是如何做到這一點,沒有,我看不到文檔在我的例子!)

回答

1

你所描述的數據庫層安全模型的類型 - 運行良好,特別是如果您從應用程序之外直接訪問數據庫。

如果您沒有外部數據庫訪問權限,則可以考慮在業務對象上創建安全性,而不是在數據模型對象上創建安全性。

在你的例子中,你會爲PRODUCT創建一個類,並且給予像CREATE這樣的權限,這意味着在下一層(數據層)中有不同級別的實際權限。

如果您有可能使用命令行從某個管理員數據損壞,那麼您可能希望堅持使用數據庫級別約束來始終確保完整性。

+0

我認爲我們遇到的問題是數據庫安全模型也進入了應用程序模型。我上面討論的權限封裝了域模型和業務對象。實質上,所有的安全性都必須發生在應用程序中,因爲維護數據庫和應用程序安全性以及任何外部訪問都通過應用程序API進行路由將成爲維護的噩夢。因此,我們在應用程序中仍然存在混亂的代碼,因爲CREATE產品可能允許訪問另一個用戶可能沒有的某個用戶的某些字段。 – boatingcow 2010-08-30 21:40:24

+1

標記爲已回答。最後,似乎沒有辦法避免嵌套的權限,像'create_product'這樣的權限實際上是由多個「父」權限組成的,比如'edit_product_name','edit_product_description'等。訣竅在於管理涉及的許多名稱。 – boatingcow 2011-09-20 09:03:28

相關問題