2011-06-11 104 views
1

我開發我的項目的訪問控制庫,我期待以最佳的解決方案來做到這一點:訪問控制問題

我正在從數據庫中所有我的訪問列表,以數組。在結果它看起來像這樣:

$array = array(
    '*' => array('administrator' => TRUE), 
    'frontend/*' => array(
     'user' => TRUE, 
     'unregistered' => TRUE 
     ), 
    'backend/*' => array(
     'user' => FALSE, 
     'unregistered' => FALSE 
    ), 
    'backend/user/*' => array(
     'moderator' => FALSE, 
     'supermoderator' => TRUE, 
    ), 
    'backend/article/*' => array(
     'supermoderator' => TRUE 
    ), 
    'backend/article/add/new' => array(
     'moderator' => TRUE 
    ) 
); 

的「*」表示此用戶具有訪問所有相關選項後端/條/ *意味着該組可以訪問所有文章選項(文/添加,文章/刪除,...)。

正如您所看到的,超級監督器中沒有backend/article/add中的項目,但它具有所有文章頁面的主控權限。

檢查此問題的最佳方法是什麼?我試過array_walk(),但我想它不會幫助我。

感謝您的建議...

我可以共享我的整個代碼,如果你想。

*編輯*

我是否儲存錯了嗎?如果你有更好的解決方案來存儲它,我會很高興聽到它。

謝謝你的任何意見

回答

0

,我發現自己的答案:

可以說,用戶試圖訪問backend/article/add/new和該用戶的supermoderator小組。所以我需要尋找backend/*backend/article/*backend/article/add/*array_slice()for()足夠:

我正在使用CodeIgniter的方式。我對它進行了一些修改,以分離前端和後端控制器。我沒有使用application/controller目錄。我正在使用application/backendapplication/frontend控制器目錄。

因此,一個URI模式是這樣的:http://site.com/[backend]*/[directory]*/class/method

// This is the page that user trying to reach 
$requested_page = "backend/article/add/new"; 

// pharsing... 
$x = explode('/', $requested_page); 

// this is needed to cut last 3, 2, 1 items of $x 
$i = count($x) > 3 ? -4 : -count($x); 

for (; $i < 0; $i++) { 
    $resource = implode('/', array_slice($x, 0, $i)) . '/*'; 
    // echoing for debug 
    echo $resource; 
} 

// Outputs: 
// backend/* 
// backend/article/* 
// backend/article/add/* 
0

不管這將是一個複雜的算法,一個簡單的array_walk不會做。除非有人覺得特別慷慨,並且會爲你寫一篇,我建議你聘請一個程序員。


我是否儲存錯了嗎?如果你有更好的解決方案來存儲它,我會很高興聽到它。

這完全取決於你的算法。你可以編寫一個使用你當前數據格式的文件。如果你改變你的數據格式,你也可以寫一個更簡單的。但是,你的數據格式應該是什麼樣子的,好吧,這對於程序員來說是一份工作。

+0

是的我可以做到爆炸的資源和檢查它。我不需要程序員。但是因爲我不太瞭解所有的PHP函數,所以我認爲一些編碼人員可以提供我的功能。 – Valour 2011-06-11 23:02:39

+0

除了可能'foreach','explode'和'in_array'之外,您並不特別需要任何PHP函數,但是這些函數在任何語言中都很常見,所以您的論點完全沒有意義。你需要一個算法。 – Halcyon 2011-06-11 23:06:17

+0

如何儲存它們?我正在使用資源=>組關係。該組=>資源關係會更有幫助嗎? – Valour 2011-06-11 23:09:25

0
function userHasPermissions($permissionsArray, $user, $path) { 
    // Check exact 
    if(isset($permissionsArray[$path]) && 
     isset($permissionsArray[$path][$user])) { 
     return $permissionsArray[$path][$user]; 
    } 

    // Check lower and lower 
    $partArr = explode('/', $path); 
    for($i = substr_count($path, '/'); $i >= 0; $i--) { 
     if($i > 0) { 
      $choppedPartArr = array_slice($partArr, 0, $i); 
      $newPath = implode($choppedPartArr, '/') . '/*'; 
     } else { 
      $newPath = '*'; 
     } 

     if(isset($permissionsArray[$newPath]) && 
      isset($permissionsArray[$newPath][$user])) { 
      return $permissionsArray[$newPath][$user]; 
     } 
    } 

    return false; 
} 

echo "Result: " . (userHasPermissions($array, 'supermoderator', 'backend/article/add') ? "true" : "false"); 

注意, '後端/條' 將返回false以來 '後端/條/ *' 不匹配它supermoderator「。要更改此設置,只需將$i = substr_count($path, '/');更改爲$i = substr_count($path, '/')+1;即可。