2013-07-17 51 views
2

我從窗體創建一個用戶,並且窗體的一部分通過選擇複選框來指定用戶的訪問權限,並且在驗證時,我會將這些值分組爲一個字符串,如:111,011,101,類似於chmod代碼。設置用戶訪問權限的最佳做法?

我只是想知道是否有更有效的方法來做這件事,因爲我所做的事情似乎很重複,或者如果這是做這件事的正確方法。

HTML複選框這樣

<input type="checkbox" name="access[1]" id="ac1"/> <label for="ac1">Consumer</label> 
<input type="checkbox" name="access[2]" id="ac2"/> <label for="ac2">Retailer</label> 
<input type="checkbox" name="access[3]" id="ac3"/> <label for="ac3">Admin</label> 

控制器

$access = $this->input->post('access'); 
$user_access = ''; 
if(!empty($access[1])) { 
    $user_access .= '1'; 
} else { 
    $user_access .= '0'; 
} 
if(!empty($access[2])) { 
    $user_access .= '1'; 
} else { 
    $user_access .= '0'; 
} 
if(!empty($access[3])) { 
    $user_access .= '1'; 
} else { 
    $user_access .= '0'; 
} 
+1

像這樣的訪問系統基於固定數量的整數放在一個字符串中彼此相鄰將嚴格限制你。你有沒有一個數據庫,你可以購買* actual *角色系統? –

+0

'if($ access = X)($ chmod = Y)'?爲什麼要追加並動態地創造一些東西? –

+0

對於你的數據庫來說,按位工作會有點沉重,當你有100個選項時會發生什麼?你會得到11111111111111 ....在我的項目中,我已經包含了[ACL](https://en.wikipedia.org/wiki/Access_control_list) –

回答

1

我會將訪問級別類型存儲在數據庫的表中。

在未來,您可以通過這種方式檢查一次他們登錄後的信息。

$stmt = $pdo->prepare("SELECT access_level FROM user WHERE ID = :userId"); 
$stmt->execute(array(":userId", $userId)); 

$userAccessLevel = $stmt->fetch(); 

$stmt = $pdo->prepare("SELECT access_level FROM access"); 
$stmt->execute(); 

foreach($stmt->fetch() as $key => $value) 
{ 
    $retailAccessLevel = array($key => $value); 
} 

if($userAccessLevel == $retailAccessLevel[0]) 
{ 
    // do stuff 
} 
else if($userAccessLevel == $retailAccessLevel[1] 
{ 
    // do stuff 
} 
else 
{ 
    // Tough luck user. 
} 

然後,你會有很容易訪問的變量,一個用戶權限,另一個權限數組。這允許您在未來輕鬆更改類型或添加更多訪問級別,而不必經常查看所有代碼並更改額外信息。請記住,我使用的是PDO,並且有比使用PDO更好的方法來使用PDO,這僅僅是爲了舉例。

1

您可以創建訪問級別的常量和事後他們進行比較。例如
CONSUMER => 1(最低訪問權限例如,零非登錄)
RETAILER => 5
ADMIN => 9(最高權限)

,然後評估訪問時,你需要知道的訪問當前所需要的水平功能並進行比較。

例如,如果你需要訪問requiredAccess = 4該網頁/功能,
那麼你可以比較喜歡:

if(requiredAccess <= userAccess){
//用戶可以訪問
}else{
//用戶沒有訪問
}

+0

如果我的消費者部分僅供消費者使用,零售商部分僅適用於零售商等,這與我正在合作,這將無法正常工作。 – Winterain

+0

@Winterain根據馬諾斯的建議,僅供消費者訪問,您需要:if(requiredAccess == userAccess){/ *用戶有權訪問*/ } else {/ *用戶無權訪問* /} – andrew

+0

點如果你只有3個固定的訪問級別,將它們存儲在數據庫中有點矯枉過正。就你而言,你可以像安德魯所說的那樣做 – Manos

相關問題