我正在为我的项目开发一个访问控制库,我正在寻找最好的解决方案:
我正在将我的所有访问列表从数据库获取到一个数组。结果看起来是这样的:
$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/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"将为"superderator"返回false,因为"backend/article/*"与之不匹配。要更改此设置,只需将$i = substr_count($path, '/');
更改为$i = substr_count($path, '/')+1;
即可。