Thinkphp下的RABC学习——2015/5/6

这篇博客介绍了如何在Thinkphp框架下实现基于角色的访问控制(RABC),通过创建用户表、权限表和角色表,以及相应的数据插入,展示了如何为不同角色分配权限。文章还提及了如何根据用户角色查询并显示其对应的权限,以及在模板中实现权限展示的逻辑。
摘要由CSDN通过智能技术生成

           RABC是把权限按角色分配 的后台管理模式

--用户表
CREATE TABLE `sw_manager` (
  `mg_id` int(11) NOT NULL AUTO_INCREMENT,
  `mg_name` varchar(32) NOT NULL,
  `mg_pwd` varchar(32) NOT NULL,
  `mg_time` int(10) unsigned NOT NULL COMMENT '时间',
  `mg_role_id` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '角色id',
  PRIMARY KEY (`mg_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8


--权限表
CREATE TABLE `sw_auth` (
  `auth_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `auth_name` varchar(20) NOT NULL COMMENT '名称',
  `auth_pid` smallint(6) unsigned NOT NULL COMMENT '父id',
  `auth_c` varchar(32) NOT NULL DEFAULT '' COMMENT '控制器',
  controller控制器 Goods
  `auth_a` varchar(32) NOT NULL DEFAULT '' COMMENT '操作方法',
  action  方法 showlist
  `auth_path` varchar(32) NOT NULL COMMENT '全路径',
  全路径:用户信息排序使用
  ① : 如果是顶级权限,全路径等于本记录主键值
  ② :如果不是顶级权限,全路径等于 "父级全路径-(中恒线)本记录主键值"
  `auth_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '级别',
  基本:0顶级权限  1次顶级权限  2次次顶级
  权限呈现缩进关系使用
  PRIMARY KEY (`auth_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

权限数据模拟:
insert into sw_auth values (1,'商品管理',0,'','',1,0);
insert into sw_auth values (2,'订单管理',0,'','',2,0);
insert into sw_auth values (3,'广告管理',0,'','',3,0);
insert into sw_auth values (4,'商品列表',1,'Goods','showlist',"1-4",1);
insert into sw_auth values (5,'添加商品',1,'Goods','add',"1-5",1);
insert into sw_auth values (6,'商品分类',1,'Goods','cate',"1-6",1);
insert into sw_auth values (7,'用户评论',1,'User','comment',"1-7",1);
insert into sw_auth values (8,'订单列表',2,'Order','showlist',"2-8",1);
insert into sw_auth values (9,'订单打印',2,'Order','print',"2-9",1);
insert into sw_auth values (10,'添加订单',2,'Order','add',"2-10",1);
insert into sw_auth values (11,'广告列表',3,'Advert','showlist',"3-11",1);
insert into sw_auth values (12,'广告位置',3,'Advert','position',"3-12",1);



--角色表
CREATE TABLE `sw_role` (
  `role_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `role_name` varchar(20) NOT NULL COMMENT '角色名称',
  `role_auth_ids` varchar(128) NOT NULL DEFAULT '' COMMENT '权限ids,1,2,5',
  "4,5,6" 关联权限的主键值用逗号连接的信息(如果有上级权限,也把上级权限的id进行关联)
  `role_auth_ac` text COMMENT '模块-操作',
  关联权限的控制器、方法连接的信息
  "Goods-showlist,Goods-add,Goods-cate"
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

角色数据模拟:
insert into sw_role values (1, '经理', "1,4,5,6","Goods-showlist,Goods-add,Goods-cate");
insert into sw_role values (2, '主管', "2,3,8,11","Order-showlist,Advert-showlist");


sw_manger表 后台管理人员账号  mg_role_id 表面了当前用户属于的角色  sw_role 是角色表 sw_auth是权限表



 `auth_path`——全路径':例如5-6-28   全路径:用户信息排序使用
  ① : 如果是顶级权限,全路径等于本记录主键值
  ② :如果不是顶级权限,全路径等于 "父级全路径-(中恒线)本记录主键值"

auth_level ——级别(深度)

auth_pid ——父级ID   auth_c——控制器 auth_a——方法


加入数据可以实现






index控制器中的left方法

function left(){
        //根据session mg_role_id 查询角色对应的权限
        $condition1 = $_SESSION['mg_role_id'];
        //判断是否为admin超级管理员
        if($condition1!=0) {
            $role = D('Role');
            $info1 = $role->where("role_id=$condition1")->find();
            //  var_dump($info);
            $role_id = $info1['role_auth_ids'];
            //echo $role_id;
            $auth = D('Auth');
            //查询出表auth中的具体信息
            //先获得顶级权限
            $auth_info = $auth->where(array('auth_id' => array('IN', $role_id), 'auth_level' => 0))->select();
            //获得次顶级权限
            $second_auth_info = $auth->where(array('auth_id' => array('IN', $role_id), 'auth_level' => 1))->select();
            //var_dump($auth_info);
            //var_dump($second_auth_info);
        }
        //为超级管理员是就赋予所有权限
        else {
            $auth = D('Auth');
            $auth_info = $auth ->where('auth_level=0')->select();
            $second_auth_info = $auth->where('auth_level=1')->select();
        }
        $this->assign('second_auth_info',$second_auth_info);
        $this->assign("auth_info",$auth_info);
        $this -> display();
    }


在smarty模板中使用一些简单逻辑实现 以上的效果

{foreach $auth_info as $k=>$v}  

//首索引的实现

{foreach $second_auth_info as $kk=>$vv}

{if $v.auth_id=$vv.auth_pid}//用来判断次索引是否是首索引的类

//输出次索引在其中用 href = {$smarty.const.__MODULE__}/{$vv.auth_c}/{$vv.auth_a} 实现跳转~~~~

{/foreach}

其中还有一些JS 代码 详情看源文件





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值