使用PHP和MySQL以每用户为基础使数据库驱动的菜单项可见?

时间:2015-04-21 21:23:50

标签: php mysql sql acl

我正在使用PHP和MySQL为管理面板构建菜单。每个菜单项都是MySQL记录。

我需要能够根据每个用户设置每个菜单记录/项目的可见性。

我意识到大多数人会在"用户组上做这件事"但是,我的老板要求相反,每个菜单项都是基于每个人的个人,以确定谁可以查看哪些菜单项。

我知道如何轻松地根据每个用户组制作一个基于每个用户组的可见性的数据库驱动菜单,但是我不确定如何在每个用户的基础上进行此操作?

如果数据库中有20个菜单项和20个用户。我需要设置一个设置/权限,以指示每个用户是否可以查看或不查看每个菜单项记录。

关于MySQL数据库结构中可能出现的任何想法和帮助?

这是我当前的菜单SQL架构...

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,
  `permission` varchar(50) NOT NULL DEFAULT 'admin',
  `notes` text,
  `active` int(2) NOT NULL DEFAULT '1',
  `sort_order` int(11) DEFAULT NULL,
  `parent_id` int(10) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

菜单系统如下图所示。将有父菜单项和子菜单项,使父菜单记录的行为类似于文件夹/目录...

enter image description here

1 个答案:

答案 0 :(得分:1)

拥有user_to_item表似乎是明显的解决方案但我仍然会选择基于组的权限。为什么呢?

想象一下,你有100K用户并且你要添加新菜单项以便所有人都可以看到,使用user_to_items表你必须做100K插入,然后当删除权限时,再次100K删除并突然你的mysql开始被碎片扼杀。 此外,你肯定会有一些公共区域可供所有人看到,而某些部分仅供管理员使用 - 再次使用群组。

我的sugestion将拥有user_to_group权限,比如说“服务器管理员”#39;分组和'其他服务',然后有个人user_to_item表,只有当用户有权分组时才会检查。 还记得有一些像孩子< - >祖先关系的东西,所以你可以快速找到某个父母的所有孩子:

item_id | name                
 1      |'Server Admin'       
 2      |'phpMyAdmin'          
 3      |'phpMyAdmin_subItem' 

item_id | ancestor_id
1       | null       
2       | 1
3       | 1
3       | 2

通过搜索ancestor_id = 1,您可以快速找到phpMyAdmin和phpMyAdmin_subItem属于Server Admin目录,然后执行权限检查。