访问控制问题

| 我正在为我的项目开发访问控制库,并且正在寻求最佳解决方案来做到这一点: 我正在将所有访问列表从数据库转移到阵列。结果看起来像这样:
$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 / *表示该组有权访问所有文章选项(article / add,article / remove等)。 如您所见,超级主持人ѭ1中没有任何项目,但它具有对所有文章页面的主访问权限。 最好的检查方法是什么?我尝试了2英镑,但我想它不会帮助我。 谢谢你的建议... 如果您愿意,我可以共享我的整个代码。 *编辑* 我存储错误吗?如果您有更好的解决方案来存储它,我将很高兴听到它。 谢谢您的任何建议     
已邀请:
        无论这将是什么复杂算法,简单的3都不会。除非有人特别慷慨,并且愿意为您编写一个,否则建议您雇用一名程序员。   我存储错误吗?如果您有更好的解决方案来存储它,我将很高兴听到它。 这完全取决于您的算法。您可能可以编写一种使用当前数据格式的文件。如果更改数据格式,也可以编写一个简单的代码。但是,那么您的数据格式应该是什么样的,对于程序员来说,这就是工作。     
        我自己找到了答案: 假设尝试访问“ 4”的用户以及该超级主持人组中的该用户。所以我需要寻找
backend/*
backend/article/*
backend/article/add/*
array_slice()
for()
就足够了: 我正在使用CodeIgniter。我对其进行了一些修改,以分离前端和后端控制器。我没有使用“ 10”目录。我正在使用
application/backend
application/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/*
    
        
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\");
请注意,\'backend / article \'对于\'supermoderator \'将返回false,因为\'backend / article / * \'与之不匹配。要更改此设置,只需将
$i = substr_count($path, \'/\');
更改为
$i = substr_count($path, \'/\')+1;
。     

要回复问题请先登录注册