Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单的PHP/MySQL ACL系统_Php_Mysql_Acl - Fatal编程技术网

简单的PHP/MySQL ACL系统

简单的PHP/MySQL ACL系统,php,mysql,acl,Php,Mysql,Acl,我用PHP和MYSQL启动了一个简单的ACL系统。但是我需要帮助完成它 我有2个数据库表,如下所示 user\u link\u权限:保存每个用户的记录,记录权限应用于的每个实体/链接… -- -- Table structure for table `user_link_permissions` -- CREATE TABLE IF NOT EXISTS `user_link_permissions` ( `id` int(100) NOT NULL AUTO_INCREMENT, `u

我用PHP和MYSQL启动了一个简单的ACL系统。但是我需要帮助完成它

我有2个数据库表,如下所示

user\u link\u权限:保存每个用户的记录,记录权限应用于的每个实体/链接…

--
-- Table structure for table `user_link_permissions`
--
CREATE TABLE IF NOT EXISTS `user_link_permissions` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `user_id` int(30) NOT NULL,
  `link_id` int(30) NOT NULL,
  `permission` int(2) NOT NULL DEFAULT '0',
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2055 ;
--
-- Table structure for table `intranet_links`
--
CREATE TABLE IF NOT EXISTS `intranet_links` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `description` text NOT NULL,
  `url` varchar(255) DEFAULT NULL,
  `notes` text,
  `user_login` varchar(255) DEFAULT NULL,
  `user_pw` varchar(255) DEFAULT NULL,
  `active` int(2) NOT NULL DEFAULT '1',
  `sort_order` int(11) DEFAULT NULL,
  `parent` int(10) NOT NULL DEFAULT '1',
  `local_route` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `local_route` (`local_route`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;
intranet\u links:基本上是权限授予或撤销用户访问权限的实体

--
-- Table structure for table `user_link_permissions`
--
CREATE TABLE IF NOT EXISTS `user_link_permissions` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `user_id` int(30) NOT NULL,
  `link_id` int(30) NOT NULL,
  `permission` int(2) NOT NULL DEFAULT '0',
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2055 ;
--
-- Table structure for table `intranet_links`
--
CREATE TABLE IF NOT EXISTS `intranet_links` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `description` text NOT NULL,
  `url` varchar(255) DEFAULT NULL,
  `notes` text,
  `user_login` varchar(255) DEFAULT NULL,
  `user_pw` varchar(255) DEFAULT NULL,
  `active` int(2) NOT NULL DEFAULT '1',
  `sort_order` int(11) DEFAULT NULL,
  `parent` int(10) NOT NULL DEFAULT '1',
  `local_route` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `local_route` (`local_route`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;

要保存这些权限设置,我有一个如下所示的矩阵式网格,其中每个复选框都是用户链接权限表中的一条记录


我需要帮助在PHP中创建一个简单的ACL函数,该函数可以根据数据库结果检查用户是否具有查看链接/实体的权限

在页面加载时,我想我可以在
user\u link\u permissions
DB表中查询具有登录用户的匹配用户ID的所有记录,并将它们存储到会话数组变量中

然后,函数可以使用该数组在实体键上使用该数组值来检查链接/实体权限

我只是无法想象它现在在PHP中的样子

需要帮忙吗

function aclCanAccess($user_id, $entity_id){


}


$entity_id = 123;
if(aclCanAccess(1, $entity_id){
    // yes user can see this item
}else{
    // NO user permission denied
}

我将把编写代码留给你,只是为了好玩

假设您正在一个名为
$\u SESSION['acl']

您的ACL功能应该:

  • 如果已查询该实体,请检查会话
  • 如果未设置,则从数据库中读取
  • 总之

    function..... {
        if(!isset($_SESSION['acl'][$entity_id])) {
            $_SESSION['acl'][$entity_id] = query here to return to you if he has access or not
        }
        return $_SESSION['acl'][$entity_id];
    }
    
    您还可以在登录用户时读取整个阵列。这也可能是适当的。在这种情况下,你应该能够

    return $_SESSION['acl'][$entity_id];
    

    但如果没有设置,我会尝试捕获异常。

    什么是int(30)?什么是整数(100)?什么是整数(2)我现在知道了。我加载与用户ID匹配的所有权限记录,并在其上循环创建一个数组
    $permissions[entity\u ID\u here]=permission value
    son,在该页面上,我需要
    entity\u ID=1
    $permissions[1]
    的权限项将为该用户保留
    0
    1
    的值。我会选择你的答案来结束这篇文章,因为这是另一个可能的解决方案。实际上,阅读你的答案,听起来好像是我提到的,所以这是一个有效的答案!谢谢,我也在使用Laravel,所以在我的DB查询中,我可以简单地使用
    ->记住(10)
    在我的查询中自动缓存。我仍然会说使用会话或某种缓存机制来实现这一点。登录时阅读一次,或者访问内容时阅读一次,但限制数据库的点击次数。我很确定Laravel中包含一些ACL,或者您可以找到一个捆绑包来更轻松地添加ACL,我会安装这样的捆绑包,看看它是如何工作的,也许只是更改实际返回权限的函数。同样,在实现RBAC之后,您将永远不会回顾像ACL这样简单的东西。ACL有可用的捆绑包,但与我构建的系统相比,一切似乎都过于复杂。此外,我的系统允许对每个用户、每个实体级别的权限,而这些权限大多只在组级别工作,而不是每个用户。因此,我的系统似乎工作得很好,而且简单、轻量级,但我将研究您提到的
    RBAC
    。谢谢