2013-07-31 51 views
0

我有一個顯示幾個鏈接作爲選項(即一個簡單的菜單)的PHP頁面,但我需要驗證登錄用戶和/或其分配的組,以查看他們是否有權訪問每個選項。PHP:如何驗證菜單中選項的訪問取決於用戶/組?

讓我來舉個例子來解釋。

我的 「menu.php」 頁面有鏈接一個簡單的HTML上市,如:

option1.php 
option2.php 
option3.php 
... 
optionN.php 

[我正在避免的HTML代碼,只是顯示的邏輯]

現在,每個選項應只對某些組和/或用戶可見。 例如,組1可以訪問選項1,2,5,組2到選項2,4,5,組3到選項1和6,用戶A到選項3,4,用戶B到選項4,6等等上。

我只需要有權爲單個用戶或他們的組提供訪問,即換句話說,它是一個OR條件,無論是組還是用戶,都不是兩個。

我通過$ _SESSION變量接收用戶和組,所以我可以直接驗證它。

現在,什麼是最好的方式來構建腳本來驗證每個選項permision?

我目前沒有使用數據庫來存儲權限的選項,所以我需要在代碼中完成所有操作(硬編碼)。

我有一個想法是爲每個選項創建幾個數組,並在每個數組中存儲每個組和有權訪問它的用戶的ID。

$option1_Users[1,2,4,5]; 
$option1_Groups[3,5]; 
$option2_Users[2,5,7]; 
$option2_Groups[1,6,12]; 
... 

...等等,然後就巢驗證每一個環節,是這樣的:

if(in_array($logged_user,$option1_Users) || in_array($logged_group,$option1_Groups){ 
echo option1.php; //the html for the option 1 link 
} 

這樣一來,每一個選項是要時間來呼應,我驗證是否用戶/組可以訪問它。

雖然它會這樣工作,但我認爲它很髒並且有很多數組(每個選項有兩次)。有沒有更好的方法來做到這一點?是否有「共同」或標準的方式來實現它?除了數組和我可以使用的普通ifs之外,還有什麼?

說明: - 每個用戶可以屬於幾個組,每個組可以有多個用戶(多對多關係),但這是無關緊要的,因爲我可以在腳本中進行驗證。

- 主要的「menu.php」已經通過數據庫驗證來訪問它,基於用戶組(如果該組沒有權限,用戶根本無法進入菜單),但目前它只能用於訪問菜單本身,但在其中,我需要再次驗證用戶/組可以看到的特定選項。我當前需要硬編碼的解決方案(我知道,髒,但我需要腳本來驗證所有的東西,而不依賴於數據庫來知道權限),但是如果你有一個涉及數據庫的解決方案和在那裏存儲權限,隨意提及它,以及如何實現它。

謝謝。

回答

1

這不是一個很好的解決方案,但幫助你讓你的代碼乾淨了一點

而不是使一堆陣列的你可以做一個主陣列中的每個選項。

$options = array(1 =>array('users' => array(1,2,3,4,5), 'groups'=>array(3,5)))) 
foreach($options as $option=>$perms) { 
    if(in_array($logged_user,perms['users']) || in_array($logged_group,perms['groups']){ 
     echo '<a href="option.'.$option.'.php">Option '.$option.'</a>'; 
    } 
} 

就像我之前說,如果你已經有了未來的表單的數據庫來處理菜單的其他部分權限是不是這個問題的理想解決方案,你應該使用,而不是創造的權限代碼的兩個部分。你注意到的硬編碼並不理想,最終可能會比你想象的更早造成頭痛。

+0

那麼,在foreach部分長相甜美,但問題是,我的選擇鏈接居然有名稱不同的只是「選項」(或任何其他前綴)+一個數字。所以我必須有_another_數組或兩個來指定鏈接的名稱(用戶將看到的html)和鏈接本身(.php文件的名稱)。無論如何,好思想。這是您的第一個upvote =) – DiegoDD

+0

感謝您的投票。我認爲你仍然可以通過爲鏈接名稱和鏈接文本添加條目來實現。 – stanlest