我正在为我的项目开发一个访问控制库,我希望找到这样做的最佳解决方案:
我将从数据库获取所有访问列表到一个数组。结果如下所示:
$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/add中没有针对超级版主的项,但它可以访问所有文章页。
检查这个的最好方法是什么?我试过array_walk(),但我想它帮不了我。
谢谢你的建议..。
如果你愿意的话我可以分享我的全部代码。
*编辑*
我存错了吗?如果你有更好的办法储存它,我会很高兴听到它。
谢谢你的建议
发布于 2011-06-11 23:52:39
我自己找到了答案:
假设试图访问backend/article/add/new的用户和超级版主组中的该用户。所以我需要找backend/*,backend/article/*,backend/article/add/*。array_slice()和for()足以满足以下要求:
顺便说一下,我正在使用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/*发布于 2011-06-11 22:55:01
无论这将是一个复杂的算法,一个简单的array_walk是做不到的。除非有人觉得特别慷慨,并会为你写一个,我建议你雇用一个程序员。
我存错了吗?如果你有更好的办法储存它,我会很高兴听到它。
这完全取决于你的算法。您可能可以使用当前的数据格式编写一个。如果您更改数据格式,也可能会编写一个更简单的。但是你的数据格式应该是什么样子呢,嗯,这是程序员的工作。
发布于 2011-06-12 09:11:10
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");请注意,‘后端/文章’将返回为‘超级版主’假,因为‘后端/文章/*’不匹配它。要改变这一点,只需将$i = substr_count($path, '/');更改为$i = substr_count($path, '/')+1;即可。
https://stackoverflow.com/questions/6318930
复制相似问题