设置用户访问权限的最佳实践


Best practise for setting user access?

我正在从表单创建一个用户,表单的一部分通过选择复选框来指定用户的访问权限,在验证时,我会将这些值分组为一个字符串,如: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';
}

我会将访问级别类型存储在数据库的表中。

这样以后,一旦他们登录,你就可以像这样检查这些信息。

$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,这只是为了举例。

您可以创建具有访问级别的常量,然后进行比较。例如
CONSUMER => 1(最低访问级别,例如0表示未登录)
RETAILER => 5
ADMIN => 9(最高访问)

然后,在评估访问时,您需要知道当前功能所需的访问级别,并对其进行比较

例如,如果该页面/功能需要访问requiredAccess = 4
然后你可以比较像:

if( requiredAccess <= userAccess ){
//用户有权访问
}else{
//用户没有访问权限
}