描述:想做一个PHP的权限菜单、根据不同的用户登录从数据库中循环出不同的主菜单及子菜单
数据库结构如下
cfg_useraccount    \\存储用户信息
cfg_role           \\存储角色信息
cfg_resource       \\存储菜单信息
cfg_permission     \\角色拥有的权限现在是可以通过登录时获取的用户ID、取到该用户所拥有的主菜单、但是如果取到该用户所拥有的子菜单呢、一般对于子菜单应该如何处理?暂时没有啥头绪
\\select a.RoleID,b.ResourceName,b.URL from cfg_permission a join cfg_resource b on a.ResourceID=b.ResourceID where  RoleID in (select RoleID from cfg_useraccount where username='admin');
//数据库CIM
create database cim default charset=utf8;//用户表
create table cfg_UserAccount
(
   ID int(4) NOT NULL PRIMARY KEY AUTO_INCREMENT,
   UserName    varchar(20),
   PassWord    varchar(20),
   MobilePhone varchar(20),
   CreateTM    varchar(20),
   UpdateTM    varchar(20),
   RoleID     int(4)
) DEFAULT CHARSET=UTF8;
//数据格式及插入测试数据
insert into cfg_UserAccount (UserName,PassWord,MobilePhone,CreateTM,RoleID) values('admin','111111','15957118564','2011-12-30','10');
insert into cfg_UserAccount (UserName,PassWord,MobilePhone,CreateTM,RoleID) values('刘成','111111','15957118564','2011-12-30','20');
insert into cfg_UserAccount (UserName,PassWord,MobilePhone,CreateTM,RoleID) values('邹琼芳','111111','13735862872','2011-12-30','30');
//角色表
create table cfg_Role
(
   RoleID int(4),
   RoleName varchar(20),
   Re    varchar(20)
)DEFAULT CHARSET=UTF8;
//插入测试数据
insert into cfg_Role(RoleID,RoleName,Re) values('10','超级管理员','具有系统所有权限');
insert into cfg_Role(RoleID,RoleName,Re) values ('20','技术部','具有客服管理等权限');
insert into cfg_Role(RoleID,RoleName,Re) values('30','部门经理','具有修改资料的权限');
insert into cfg_Role(RoleID,RoleName,Re) values('40','财务经理','统计考勤及奖金'); 
//资源表
create table cfg_Resource
(
ResourceID     int(4),
ResourceName   varchar(20),
Re         varchar(20),
URL            varchar(100),
);insert into cfg_Resource (ResourceID,ResourceName,Re,URL) values('100','客服管理','对日常客服记录进行管理','SeviceManager.php');
insert into cfg_Resource (ResourceID,ResourceName,Re,URL) values('101','客服子菜单1','对日常客服记录进行管理','SeviceManager.php?action=add');
insert into cfg_Resource (ResourceID,ResourceName,Re,URL) values('102','客服子菜单2','对日常客服记录进行管理','SeviceManager.php?action=del');
insert into cfg_Resource (ResourceID,ResourceName,Re,URL) values('200','会员管理','会员新增和查询','MemberService.php');
insert into cfg_Resource (ResourceID,ResourceName,Re,URL) values('300','查询管理','查询管理','Search.php');
insert into cfg_Resource (ResourceID,ResourceName,Re,URL) values('400','回访管理','对客服记录进行回访','Visit.php');
insert into cfg_Resource (ResourceID,ResourceName,Re,URL) values('500','知识库','产品FAQ','Knowledge.php');
insert into cfg_Resource (ResourceID,ResourceName,Re,URL) values('600','数据管理','数据备份统计相关','Backup.php');
insert into cfg_Resource (ResourceID,ResourceName,Re,URL) values('700','硬件返修','硬件产品返修','Repair.php');
insert into cfg_Resource (ResourceID,ResourceName,Re,URL) values('800','系统管理','系统管理相关','System.php');
create table cfg_Permission
(
RoleID int(4),
ResourceID int(4)
)//权限表
insert into cfg_Permission (RoleID,ResourceID) values('10','100');
insert into cfg_Permission (RoleID,ResourceID) values('10','200');
insert into cfg_Permission (RoleID,ResourceID) values('10','300');
insert into cfg_Permission (RoleID,ResourceID) values('10','400');
insert into cfg_Permission (RoleID,ResourceID) values('10','500');
insert into cfg_Permission (RoleID,ResourceID) values('10','600');
insert into cfg_Permission (RoleID,ResourceID) values('10','700');
insert into cfg_Permission (RoleID,ResourceID) values('10','800');

解决方案 »

  1.   

    对于那些搞出所谓rbac的人想说一句话,“别扯淡了,简单问题复杂化”
      

  2.   

    【现在是可以通过登录时获取的用户ID、取到该用户所拥有的主菜单、但是如果取到该用户所拥有的子菜单呢、】大中型系统的权限处理之探讨方法1  find_in_set针对上述问题
    设A用户id是1,B用户id是2,C用户id是3,
    建立数据库,设置字段,类型为集合类型,一条记录对应一个菜单功能,一般可以是php文件的名字,。语句判断该用户的id是否在此字段内,若存在,则加载。。
      

  3.   

    一些建议1.表似乎可以合并成一个
    2.关于权限,你可以在读取权限后赋值给session
    然后根据权限include 菜单/子菜单内容权限判断当然是要用到if 的,这是应该让php来做的,而不是让mysql来"读取"的.将权限判断写成一个类,然后include不同的文件就好了
      

  4.   


    额。我真的以为权限就两种方法好实现、一种就是RBAC 一种就是凡是设计到权限的地方都判断一下唉,,,,我就想写个简单的系统出来自己公司用用,PHP也刚学、主要是也没什么思路,希望大家多帮忙拉
      

  5.   

    哈哈,真8好意思呀,活还没干完,大家差点干上了,
    PhpNewnew 是好淫、帮过我好多次了呢、但是这次这个问题我自己想了几天,没什么眉目、现在还是没眉目、哈哈
      

  6.   

    我最近也在设计权限系统这个问题,听大家说rbac挺有意思。我研究研究,有没有在我研究之前警告我的人。
      

  7.   

    //权限表
    insert into cfg_Permission (RoleID,ResourceID) values('10','100');
    ===============================================================
    你的角色应该关联具体的操作,而不是关联主模块。
    举个例子,你的客服管理应该包括#1.访问 101
    #2.添加 101
    #3.编辑 103
    #4.删除 104你的RoleID应该与具体的操作关联,然后反推出RoleID关联的模块。
      

  8.   


    子项目隶属于项目、但是实际业务当中可能涉及到不同的角色对于同一个菜单的子菜单有不同的权限例如 菜单 A 有子菜单 A1 A2 A3
    角色role1 拥有菜单A的全部权限
    角色role2 拥有菜单A中A1 的权限
    角色role3 拥有菜单A中A2 A3的权限这个时候就需要对子菜单进行管理了,当然首先要区分出子菜单和父菜单、我现在是不知道如何在程序中分辨出子菜单和父菜单
      

  9.   

    貌似  我觉得 还比较  简单吧!~是我理会错误?菜单表里加一个权限的字段,INT的几级权限可以看到此项目这个在SQL的语句里就可以指定出来那么 首先他要先读取用户信息 然后得到用户的权限 比如是5级权限 where qx>=5 他就看不到4以上权限才能看见的内容。