PHP:如何根据用户/组验证菜单中选项的访问权限?

时间:2013-07-31 18:35:53

标签: php validation acl user-permissions

我有一个php页面,显示多个链接作为选项(即一个简单的菜单),但我需要验证登录用户和/或其分配的组,以查看他们是否有权访问每个选项。

让我用一个例子来解释。

我的“menu.php”页面有一个简单的html链接列表,例如:

option1.php
option2.php
option3.php
...
optionN.php

[我正在避免使用HTML代码,只显示逻辑]

现在,每个选项应仅对某些组和/或用户可见。 例如,组1可以访问选项1,2,5,组2,选项2,4,5,组3到选项1和6,用户A到选项3,4,用户B到选项4,6等等

我只需要获得单个用户或其组的权限即可授予访问权限, 换句话说,它是一个OR条件,无论是组还是用户,都不是必然的。

我通过$ _SESSION变量收到用户和组,所以我可以直接验证它。

现在,构建脚本以验证每个选项权限的最佳方法是什么?

我目前没有使用数据库存储权限的选项,所以我需要在代码中完成所有操作(硬编码)。

我的想法是为每个选项创建多个数组,并在每个数组中存储每个组的ID以及有权访问它的用户。

$option1_Users[1,2,4,5];
$option1_Groups[3,5];
$option2_Users[2,5,7];
$option2_Groups[1,6,12];
...

......依此类推,然后使用验证嵌套每个链接,例如:

if( in_array($logged_user,$option1_Users) || in_array($logged_group,$option1_Groups){
echo option1.php; //the html for the option 1 link
}

这样,每次回显一个选项时,我都会验证用户/组是否可以访问它。

虽然它会以这种方式工作,但我认为它非常脏并且有很多数组(每个选项两次)。有没有更好的方法来做这一切?是否有“共同”或标准的方法来实现它?除了数组和普通ifs之外我还能使用什么?

注意: - 每个用户可以属于多个组,每个组可以有多个用户(多对多关系),但这是无关紧要的,因为我可以在脚本中进行验证。

- 主“menu.php”已经HAS数据库验证访问它,基于用户组(如果该组没有权限,用户根本无法进入菜单),但目前只有用于允许访问菜单本身,但在其中,我需要再次验证用户/组可以看到的具体选项。

- 我目前需要硬编码的解决方案(我知道,脏,但我需要脚本来自行验证所有内容,而不是依赖于数据库来了解权限),但是如果你有一个涉及数据库和存储的解决方案那里的权限,随意提及,以及如何实现它。

感谢。

2 个答案:

答案 0 :(得分:1)

这不是一个很好的解决方案,但可以帮助您使代码更清洁

不是为每个选项创建一堆数组,而是可以创建一个主数组。

$options = array(1 =>array('users' => array(1,2,3,4,5), 'groups'=>array(3,5))))
foreach($options as $option=>$perms) {
    if( in_array($logged_user,perms['users']) || in_array($logged_group,perms['groups']){
        echo '<a href="option.'.$option.'.php">Option '.$option.'</a>';
    }
}

就像我之前所说的那样,如果您已经拥有从数据库处理菜单其他部分的权限,那么这个问题不是理想的解决方案,您应该使用它而不是创建两部分权限代码。你所记录的硬编码也不理想,最终可能比你想象的更快地让你头疼。

答案 1 :(得分:0)

您可能希望使用授权框架,让您表达您的方案。查看支持外部化,基于策略的授权的XACML(http://www.webfarmr.eu/2012/11/call-out-to-a-xacml-policy-decision-point-pdp-from-php/)。

似乎Sentry也为PHP提供了一个AuthZ框架:http://docs.cartalyst.com/sentry-2