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

Posted

技术标签:

【中文标题】PHP:如何根据用户/组验证对菜单中选项的访问?【英文标题】:PHP: how to validate access to options in a menu depending on user/group? 【发布时间】:2013-07-31 18:35:52 【问题描述】:

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

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

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

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

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

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

谢谢。

【问题讨论】:

【参考方案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>';
    

就像我之前说的,如果您已经拥有来自数据库的权限来处理菜单的其他部分,那么这不是解决此问题的理想解决方案,您应该使用它而不是创建两段权限代码。此外,您提到的硬编码并不理想,最终可能会比您想象的更早让您头疼。

【讨论】:

好吧,foreach 部分看起来不错,但问题是我的选项链接实际上的名称不同于“选项”(或任何其他前缀)+ 一个数字。所以我必须有一两个 another 数组来指定链接的名称(用户将看到的 html)和链接本身(.php 文件的名称)。总之,好想。这是你的第一个赞 =) 感谢您的支持。我认为您仍然可以通过为链接名称和链接文本添加整体来实现它。【参考方案2】:

您可能希望使用授权框架来表达您的场景。查看支持外部化、基于策略的授权的 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

【讨论】:

以上是关于PHP:如何根据用户/组验证对菜单中选项的访问?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置共享文件夹访问无需验证即可进入

如何查看 Ajax 传递给 PHP 的数据以及 PHP 对数据的作用 - 下拉菜单选项

获取选择菜单以根据 MySQL SELECT 结果动态显示特定的选择选项

如何阻止对根文件夹中除 index.php 之外的所有 .php 的访问(通过 .htaccess)?

如何根据权限设计菜单栏

引导、导航选项卡、下拉菜单;如何根据 URI 设置活动选项卡