简单 PHP/MySQL ACL 系统

Simple PHP/MySQL ACL System

我在 PHP 和 MYSQL 中有一个简单的 ACL 系统。不过我需要帮助完成它...

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

user_link_permissions :为每个用户保存一条记录,每个 entity/link 权限适用于...

--
-- 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 table...

中的一条记录


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

在页面加载时,我想我可以查询 user_link_permissions 数据库 table 以获取具有已登录用户的匹配用户 ID 的所有记录,并将它们存储到会话数组变量中。

函数然后可以使用该数组来检查 link/entity 使用实体键上的数组值的权限。

我无法想象它在 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
}

我会把代码留给你玩。

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

的变量中

您的 ACL 功能应该:

  1. 如果您已经查询过该实体,请检查会话
  2. 如果没有设置,从数据库中读取

简而言之

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

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