简单的PHP / MySQL ACL系统

时间:2015-08-17 22:15:57

标签: php mysql acl

我在PHP和MYSQL中启动了一个简单的ACL系统。我需要帮助才能完成它......

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

user_link_permissions:为权限适用的每个实体/链接上的每个用户保留一条记录...

--
-- 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 ;

intranet_links:基本上是权限提供或撤消用户访问权限的实体

--
-- 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 ;

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

enter image description here

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

在页面加载时,我想我可以在user_link_permissions数据库表中查询具有匹配用户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
}

1 个答案:

答案 0 :(得分:2)

我将把代码写给你以获得乐趣。

假设您将所有先前查询的权限存储在名为$_SESSION['acl']

的变量中

您的ACL功能应该:

  1. 检查会话是否已查询该实体
  2. 如果未设置,请从db
  3. 中读取

    简而言之

    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];
    

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