2012-03-11 248 views
0

我目前有一個數組,用於保存用戶可以執行的信息。我目前在一個非常好的下拉菜單中使用了一個這樣的實例。我現在想要做的只是包括特定的項目,如果他們有權訪問它。所以說如果$ user_access = 2,那麼他們可以做Download-> small_image而不是Download-> large_image。我想能夠分配什麼默認訪問數組中的每個項目...甚至是關鍵。所以我可以說用戶訪問權限是0,所以他們根本不應該顯示「下載」。將更多數據添加到數組

我想也許把每個訪問整數放在一個對象中。所以$ access-> download-> small_image = 2;然後我可以逐個檢查一個訪問級別是否大於或等於它並將其添加到數組中?我其實不知道我將如何做循環,並正確地建立陣列。另一種方法......可能會將訪問值以某種方式放入實際數組中?任何想法都會很棒。

$var = array("Download" =>             
        array("small_image" => "ajax_load",       
         "large_image" => "/master.php"),      
        "Page" =>              
        array("Edit" => "edit.php",         
         "View" => "view.php",         
         "Stuff" => "stuff.php")         
        );  

回答

0

訪問控制始終是一個模糊的問題,因爲有期權數量不受限制。這聽起來像你會很樂意與接入陣列,IE:

array(
    0 => "root", 
    10 => "Group1", 
    20 => "Group2" 
); 

,我可能會使用一個數組爲你的ACL(訪問控制列表)也:

$ACL = array(
    "Download" => array(
     "Small_Image" => 10, 
     "Large_Image" => 20 
    ), 
    "Page" => array(
     "Edit" => 0, 
     "View" => 10 
    ) 
); 

然後調用一個函數授權:

function checkACL($option, $arg, $lvl) 
{ 
    if($ACL[$option][$arg] >= $lvl) 
     return true; 
    else 
     return false; 
}; 

$userLevel = 10; 
if(checkACL("Page", "Edit", $userLevel)) { 
    /* 
    * Display Edit page here. 
    */ 
} else { 
    /* 
    * Display "Not authorized" or redirect to a different page. 
    */ 
} 

對不起,希望沒有太多的話題。
但是你可以調整它來顯示你的菜單。我假設你有一個登錄系統已經粗:)的

if(checkACL("Download", "Small_Image", $userLevel)) 
    echo '<a href="'.$var['Download']['Small_Image'].'">Small Image</a>'; 

編輯:

$var = array(
    "download.small_image" => array(
     "id" => 1001, 
     "file" => "/img/blue.png", 
     "width" => "100px", 
     "height"=> "100px", 
     "accessLevel"=> 20 
    ), 
    "page.listUsers" => array(
     "id" => 1011, 
     "file" => "/pages/list.php", 
     "accessLevel" => 10 
    ) 
); 

所以它工作在相同的原則,但所有的信息集中。
如果我不使用數據庫,我會做什麼將它作爲json文件存儲。
你不想將它硬編碼到一個php文件中,你希望它很容易修改。

// This will load your permissions into $var 
$var = json_decode(file_get_contents("/acl.json")); 

// If you design a page to modify permissions, you can save the file with this. 
file_put_contents("/acl.json", json_encode($var)); 

// json is simple, it's basically just { "key" : "val" } 
+0

@Bradley_Forster - 這意味着我需要兩個數組爲同一事物...所以$ ACL數組和我的原始數組?我喜歡你有什麼想法,但如果項目發生變化,在兩個地方的變化看起來效率低下。用對象做什麼更有效率? – user983223 2012-03-11 14:35:41

+0

啊,是的,我結束了。我習慣於處理數據庫,在那裏你可以有你的acl表,用戶表和你需要的東西。並且可以在一個查詢中爲單個用戶獲取所有內容。我不知道我是怎麼看的,你可以使用相同的概念..我會做一個編輯。 – Bradmage 2012-03-11 15:23:52

+0

我不知道你對mysql有多熟悉,但是如果你感興趣的話,我會有一個底層的,[http://stackoverflow.com/a/9651249/1246494](http://stackoverflow.com/a/ 1246494分之9651249) – Bradmage 2012-03-11 15:39:26