2012-02-28 80 views
4

我想設計一個數據庫爲RBAC與扭曲(或者也許它唯一的我認爲它的扭曲?)。據我所知RBAC使用角色和權限授予/拒絕訪問我的系統中的某些對象。一切都不錯,清晰時,我有我的網站只是一個實例,只是創建角色「Main admin」,「Secondary admin」,「User」等RBAC與額外的水平

但是如果我有系統內的賬戶?所以我有一個系統說'London','Tokyo'和'Moscow'帳戶。現在,我將爲每個帳戶以及每個帳戶中的許多「用戶」設置「主管理員」 - 當然,莫斯科員工不應該能夠登錄到倫敦帳戶。我該怎麼做?我是否創建了一些將綁定分配給用戶帳戶的附加表?或者,我是否將accountid添加到作業表?或者,也許我應該創建多個角色,如'moscow_main_admin','london_main_admin'等。對於這種情況,最佳方法是什麼?

另外我相信我會有一些用戶是倫敦帳戶的'主管理員'和東京帳戶的'二級管理員'。

我打算使用Yii,它內置RBAC ...如果這有什麼區別。

如何解決它?

預先感謝您!

回答

1

您可以保留「admin」角色和規則,因爲您已經使用了它們。併爲每個城鎮的「莫斯科」,「倫敦」等添加一個新角色....在您的控制器中,在您的操作方法中調用checkAccess,如下例所示。

public function actionEditArticle($town) 
{ 
if(!Yii::app()->user->checkAccess($town) 
    Yii::app()->end(); 

// ... more code 
} 

更先進的方法是在你的組件目錄擴展CController,並覆蓋runAction($action)方法。

public function runAction($action) 
{ 
    if (isset($_GET['town']) { 
     if(!Yii::app()->user->checkAccess($_GET['town']) Yii::app()->end(); 
    } 
    parent::runAction($action); 
} 
0

從我所瞭解的您的問題中,可能有兩種方法可以解決您的問題。

第一個是通過使用層次角色(角色繼承)。雖然實施和管理起來比較複雜,但它可以提供一個非常有趣的靈活性水平。

第二種方法是(如果它可能是感興趣的)是我在試圖「擴展」RBAC時因爲學術原因而嘗試過的。

我所做的是允許爲每個角色定義兩個或多個「命名」級別。因此,給予程序員的角色,我的實現允許添加水平的作用,如:

編程,水平清晰度:

  1. 「高級」 =水平500
  2. 「中級」 =水平200
  3. 「小型」 = 0級

因此,當有人會上的對象的一個​​實例指派權限諸如規範文檔,它可以被以下面的方式分配:

「一些文件」 - >編程器(水平300) - >可以編輯 「一些文件」 - >編程器(電平0) - >可以讀取 「一些文件」 - >編程器(水平500) - >能刪除

這表示所有程序員都可以閱讀文檔,但由於缺乏「級別」權限,所以不允許小輩和中間人編輯此類文檔。只有高級程序員可以刪除文件。

這使我可以通過創建一個角色來獲得3個不同級別的權限。在傳統的系統中,我將不得不創建三個不同的角色(4繼承),如:

在非分層實現:

  1. 高級程序員
  2. 中級程序員
  3. 初級程序員

在分層實現:

  1. 程序員
  2. 高級程序員(擴展編程)
  3. 中級程序員(擴展編程)
  4. 初級程序員(擴展編程)

顯然,水平需要進行適當定義爲子角色。將級別定義爲「分析師」將無效,因爲這是兩個不同的角色,而不是子類型。

0

最適合您的要求是創建一個組和組的層次結構。將角色分配給將間接分配給其所有子組的角色。通過這種方式,您可以將共同角色分配給父母組,並將個人角色分配給個人組。所以,在你的情況下,倫敦,東京和莫斯科是團體。

我通過安全訪問控制工具Visual Guard實施了這個解決方案,該工具已經實現並覆蓋了大部分應用程序安全問題。

我已經使用了Visual Guard來訪問多租戶和saas應用程序的控件,其中我廣泛使用了組。

Click here閱讀更多。