访问控制问题



我正在为我的项目开发一个访问控制库,我正在寻找最好的解决方案:

我正在将我的所有访问列表从数据库获取到一个数组。结果看起来是这样的:

$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,…)。

正如您所看到的,backend/article/add中没有超级模型的项目,但它拥有对所有文章页面的主访问权限。

检查这个的最佳方法是什么?我试过array_walk(),但我想它对我没有帮助

谢谢你的建议。。。

如果你愿意,我可以分享我的整个代码。

*编辑*

我存储错误了吗?如果你有更好的解决方案来存储它,我会很高兴听到它。

感谢您的任何建议

无论这将是一个复杂的算法,一个简单的array_walk都不行。除非有人觉得特别慷慨,愿意为你写一个,否则我建议你雇佣一名程序员


我存储错误了吗?如果你有更好的解决方案来存储它,我会很高兴听到它。

这完全取决于你的算法。您可能可以编写一个使用当前数据格式的程序。如果您更改数据格式,您也可以编写一个更简单的程序。但是你的数据格式应该是什么样子,好吧,这是程序员的工作。

我自己找到了答案:

比方说试图访问CCD_ 4的用户和超级模型组中的该用户。所以我需要查找backend/*backend/article/*backend/article/add/*。CCD_ 8和CCD_

顺便说一下,我正在使用CodeIgniter。我对它做了一点修改,将前端和后端控制器分开。我没有使用application/controller目录。我使用application/backendapplication/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"将为"superderator"返回false,因为"backend/article/*"与之不匹配。要更改此设置,只需将$i = substr_count($path, '/');更改为$i = substr_count($path, '/')+1;即可。

相关内容

  • 没有找到相关文章

最新更新