2011-06-11 113 views
1

我开发我的项目的访问控制库,我期待以最佳的解决方案来做到这一点:访问控制问题

我正在从数据库中所有我的访问列表,以数组。在结果它看起来像这样:

$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(),但我想它不会帮助我。

感谢您的建议...

我可以共享我的整个代码,如果你想。

*编辑*

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

谢谢你的任何意见

回答

0

,我发现自己的答案:

可以说,用户试图访问backend/article/add/new和该用户的supermoderator小组。所以我需要寻找backend/*backend/article/*backend/article/add/*array_slice()for()足够:

我正在使用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/* 
0

不管这将是一个复杂的算法,一个简单的array_walk不会做。除非有人觉得特别慷慨,并且会为你写一篇,我建议你聘请一个程序员。


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

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

+0

是的我可以做到爆炸的资源和检查它。我不需要程序员。但是因为我不太了解所有的PHP函数,所以我认为一些编码人员可以提供我的功能。 – Valour 2011-06-11 23:02:39

+0

除了可能'foreach','explode'和'in_array'之外,您并不特别需要任何PHP函数,但是这些函数在任何语言中都很常见,所以您的论点完全没有意义。你需要一个算法。 – Halcyon 2011-06-11 23:06:17

+0

如何储存它们?我正在使用资源=>组关系。该组=>资源关系会更有帮助吗? – Valour 2011-06-11 23:09:25

0
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"); 

注意, '后端/条' 将返回false以来 '后端/条/ *' 不匹配它supermoderator“。要更改此设置,只需将$i = substr_count($path, '/');更改为$i = substr_count($path, '/')+1;即可。