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

PHP:如何根据用户/组验证对菜单中选项的访问?,php,validation,acl,user-permissions,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

我有一个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等等

我只需要拥有单个用户或其组的访问权限, 换句话说,它是一个或条件,要么是组,要么是用户,不一定两者都是

我通过$会话变量接收用户和组,因此我可以直接验证它

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

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

我的一个想法是为每个选项创建几个数组,并在每个选项中存储每个组的ID和有权访问它的用户的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”已经基于用户组对其进行了访问的数据库验证(如果用户组没有权限,用户就无法进入菜单),但目前它只允许访问菜单本身,但在它内部,我需要再次验证用户/组可以看到哪些特定选项

-我目前需要对解决方案进行硬编码(我知道,脏的,但我需要脚本自己验证所有内容,不依赖数据库来了解权限),但是如果您有一个涉及数据库并将权限存储在其中的解决方案,请随意提述它,以及如何实现它


谢谢。

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

您可以创建一个主阵列,而不是为每个选项创建一组阵列

$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>';
    }
}
$options=array(1=>array('users'=>array(1,2,3,4,5),'groups'=>array(3,5)))
foreach($options as$option=>$perms){
if(in_数组($logged_user,perms['users'))| in_数组($logged_group,perms['groups')){
回声';
}
}

正如我之前所说,如果您已经拥有来自数据库的权限来处理菜单的其他部分,则不是解决此问题的理想方法。您应该使用该权限,而不是创建两段权限代码。此外,您指出的硬编码并不理想,可能会比您想象的更快地让您头痛。

您需要可能希望使用一个授权框架来表达您的场景


看起来Sentry也为PHP提供了一个AuthZ框架:

好吧,foreach部分看起来很不错,但问题是我的选项链接实际上有不同的名称,只有“option”(或任何其他前缀)+一个数字。因此,我必须有另外一两个数组来指定两个链接的名称(用户将看到的html)以及链接本身(这些.php文件的名称)。无论如何,想法不错。这是您的第一次upvote=)谢谢您的投票。我认为您仍然可以通过为链接名和链接文本添加entires来实现这一点。