简单的PHP/MySQL ACL系统
我用PHP和MYSQL启动了一个简单的ACL系统。但是我需要帮助完成它 我有2个数据库表,如下所示 user\u link\u权限:保存每个用户的记录,记录权限应用于的每个实体/链接…简单的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
--
-- 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
。谢谢