ThinkPHP中:RBAC权限控制的实习步骤

使用版本ThinkPHP3.1.3

第一步,建表及数据

第二步,建关联模型

第三步,控制器使用关联模型、配置文件

第四步,模板显示数据



第一步,建表及数据

在数据库中,建立一个companysvn数据库,库下建立五张表

建表好导入数据的代码如下

  1 # --------------------------------------------------------
  2 # Host:                         127.0.0.1
  3 # Server version:               5.0.45-community-nt-log
  4 # Server OS:                    Win32
  5 # HeidiSQL version:             6.0.0.3603
  6 # Date/time:                    2015-02-11 10:01:26
  7 # --------------------------------------------------------
  8
  9 /*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */;
 10 /*!40101 SET NAMES utf8 */;
 11 /*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
 12 /*!40101 SET @[email protected]@SQL_MODE, SQL_MODE=‘NO_AUTO_VALUE_ON_ZERO‘ */;
 13
 14 # Dumping database structure for companysvn
 15 CREATE DATABASE IF NOT EXISTS `companysvn` /*!40100 DEFAULT CHARACTER SET utf8 */;
 16 USE `companysvn`;
 17
 18
 19 # Dumping structure for table companysvn.ad_access
 20 CREATE TABLE IF NOT EXISTS `ad_access` (
 21   `role_id` smallint(6) unsigned NOT NULL,
 22   `node_id` smallint(6) unsigned NOT NULL,
 23   `level` tinyint(1) NOT NULL,
 24   `module` varchar(50) default NULL,
 25   KEY `groupId` (`role_id`),
 26   KEY `nodeId` (`node_id`)
 27 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 28
 29 # Dumping data for table companysvn.ad_access: 16 rows
 30 /*!40000 ALTER TABLE `ad_access` DISABLE KEYS */;
 31 INSERT INTO `ad_access` (`role_id`, `node_id`, `level`, `module`) VALUES
 32     (1, 11, 3, NULL),
 33     (1, 12, 3, NULL),
 34     (1, 13, 3, NULL),
 35     (1, 10, 3, NULL),
 36     (1, 9, 3, NULL),
 37     (1, 8, 3, NULL),
 38     (1, 5, 2, NULL),
 39     (1, 18, 3, NULL),
 40     (1, 3, 2, NULL),
 41     (2, 4, 2, NULL),
 42     (2, 18, 3, NULL),
 43     (2, 3, 2, NULL),
 44     (2, 1, 1, NULL),
 45     (1, 1, 1, NULL),
 46     (2, 6, 3, NULL),
 47     (2, 7, 3, NULL);
 48 /*!40000 ALTER TABLE `ad_access` ENABLE KEYS */;
 49
 50
 51 # Dumping structure for table companysvn.ad_node
 52 CREATE TABLE IF NOT EXISTS `ad_node` (
 53   `id` smallint(6) unsigned NOT NULL auto_increment,
 54   `name` varchar(20) NOT NULL,
 55   `title` varchar(50) default NULL,
 56   `status` tinyint(1) default ‘0‘,
 57   `remark` varchar(255) default NULL,
 58   `sort` smallint(6) unsigned default NULL,
 59   `pid` smallint(6) unsigned NOT NULL,
 60   `level` tinyint(1) unsigned NOT NULL,
 61   PRIMARY KEY  (`id`),
 62   KEY `level` (`level`),
 63   KEY `pid` (`pid`),
 64   KEY `status` (`status`),
 65   KEY `name` (`name`)
 66 ) ENGINE=MyISAM AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;
 67
 68 # Dumping data for table companysvn.ad_node: 18 rows
 69 /*!40000 ALTER TABLE `ad_node` DISABLE KEYS */;
 70 INSERT INTO `ad_node` (`id`, `name`, `title`, `status`, `remark`, `sort`, `pid`, `level`) VALUES
 71     (1, ‘Admin‘, ‘后台应用‘, 1, NULL, 1, 0, 1),
 72     (2, ‘Index‘, ‘前端应用‘, 1, NULL, 1, 0, 1),
 73     (3, ‘Index‘, ‘后台首页‘, 1, NULL, 1, 1, 2),
 74     (4, ‘MsgManager‘, ‘帖子管理‘, 1, NULL, 1, 1, 2),
 75     (5, ‘Rbac‘, ‘RBAC权限‘, 1, NULL, 1, 1, 2),
 76     (6, ‘index‘, ‘帖子列表‘, 1, NULL, 1, 4, 3),
 77     (7, ‘delete‘, ‘删除帖子‘, 1, NULL, 1, 4, 3),
 78     (8, ‘index‘, ‘用户列表‘, 1, NULL, 1, 5, 3),
 79     (9, ‘role‘, ‘角色列表‘, 1, NULL, 1, 5, 3),
 80     (10, ‘node‘, ‘节点列表‘, 1, NULL, 1, 5, 3),
 81     (11, ‘addUser‘, ‘添加用户‘, 1, NULL, 1, 5, 3),
 82     (12, ‘addRole‘, ‘添加角色‘, 1, NULL, 1, 5, 3),
 83     (13, ‘addNode‘, ‘添加节点‘, 1, NULL, 1, 5, 3),
 84     (14, ‘Member‘, ‘会员中心‘, 1, NULL, 1, 0, 1),
 85     (15, ‘Index‘, ‘前端首页‘, 1, NULL, 1, 2, 2),
 86     (16, ‘index‘, ‘首页面‘, 1, NULL, 1, 15, 3),
 87     (17, ‘newsList‘, ‘新闻列表‘, 1, NULL, 1, 15, 3),
 88     (18, ‘main‘, ‘后台首页‘, 1, NULL, 1, 3, 3);
 89 /*!40000 ALTER TABLE `ad_node` ENABLE KEYS */;
 90
 91
 92 # Dumping structure for table companysvn.ad_role
 93 CREATE TABLE IF NOT EXISTS `ad_role` (
 94   `id` smallint(6) unsigned NOT NULL auto_increment,
 95   `name` varchar(20) NOT NULL,
 96   `pid` smallint(6) default NULL,
 97   `status` tinyint(1) unsigned default NULL,
 98   `remark` varchar(255) default NULL,
 99   PRIMARY KEY  (`id`),
100   KEY `pid` (`pid`),
101   KEY `status` (`status`)
102 ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
103
104 # Dumping data for table companysvn.ad_role: 2 rows
105 /*!40000 ALTER TABLE `ad_role` DISABLE KEYS */;
106 INSERT INTO `ad_role` (`id`, `name`, `pid`, `status`, `remark`) VALUES
107     (1, ‘Manager‘, NULL, 1, ‘普通管理员‘),
108     (2, ‘Editor‘, NULL, 1, ‘网站编辑‘);
109 /*!40000 ALTER TABLE `ad_role` ENABLE KEYS */;
110
111
112 # Dumping structure for table companysvn.ad_role_user
113 CREATE TABLE IF NOT EXISTS `ad_role_user` (
114   `role_id` mediumint(9) unsigned default NULL,
115   `user_id` char(32) default NULL,
116   KEY `group_id` (`role_id`),
117   KEY `user_id` (`user_id`)
118 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
119
120 # Dumping data for table companysvn.ad_role_user: 4 rows
121 /*!40000 ALTER TABLE `ad_role_user` DISABLE KEYS */;
122 INSERT INTO `ad_role_user` (`role_id`, `user_id`) VALUES
123     (1, ‘2‘),
124     (2, ‘4‘),
125     (1, ‘4‘),
126     (2, ‘3‘);
127 /*!40000 ALTER TABLE `ad_role_user` ENABLE KEYS */;
128
129
130 # Dumping structure for table companysvn.ad_user
131 CREATE TABLE IF NOT EXISTS `ad_user` (
132   `id` int(10) unsigned NOT NULL auto_increment,
133   `username` char(20) NOT NULL,
134   `password` char(32) NOT NULL,
135   `logintime` int(10) unsigned NOT NULL,
136   `loginip` varchar(30) NOT NULL,
137   `lock` tinyint(1) unsigned NOT NULL,
138   PRIMARY KEY  (`id`),
139   UNIQUE KEY `username` (`username`),
140   KEY `id` (`id`)
141 ) ENGINE=MyISAM AUTO_INCREMENT=41 DEFAULT CHARSET=utf8;
142
143 # Dumping data for table companysvn.ad_user: 4 rows
144 /*!40000 ALTER TABLE `ad_user` DISABLE KEYS */;
145 INSERT INTO `ad_user` (`id`, `username`, `password`, `logintime`, `loginip`, `lock`) VALUES
146     (1, ‘admin‘, ‘21232f297a57a5a743894a0e4a801fc3‘, 1423578142, ‘127.0.0.1‘, 0),
147     (3, ‘wangwu‘, ‘9f001e4166cf26bfbdd3b4f67d9ef617‘, 1423315785, ‘127.0.0.1‘, 0),
148     (4, ‘zhaoliu‘, ‘27311020efc4ce2806feca0aab933fbd‘, 1423578114, ‘127.0.0.1‘, 0),
149     (2, ‘lisi‘, ‘dc3a8f1670d65bea69b7b65048a0ac40‘, 1423574601, ‘127.0.0.1‘, 0);
150 /*!40000 ALTER TABLE `ad_user` ENABLE KEYS */;
151 /*!40101 SET [email protected]_SQL_MODE */;
152 /*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
153 /*!40101 SET [email protected]_CHARACTER_SET_CLIENT */;

效果如图:

数据库

01-ad_user结构和数据

==============================================================

02-ad_role结构和数据

==============================================================

03-ad_role_user结构和数据

==============================================================

04-ad_node结构和数据

05-ad_access结构和数据

==============================================================

第二步,建关联模型

UserRelationModel.class.php中的代码如下

 1 <?php
 2 class UserRelationModel extends RelationModel{
 3     //定义主表名称
 4     protected $tableName=‘user‘;
 5     //定义关联关系
 6     protected $_link=array(
 7         ‘role‘=>array(
 8             ‘mapping_type‘=>MANY_TO_MANY,   //多对多关系
 9             ‘relation_table‘=>‘ad_role_user‘,//中间表名称
10             ‘foreign_key‘=>‘user_id‘,       //主表在中间表中的字段名称
11             ‘relation_key‘=>‘role_id‘,      //副表在中间表中的字段名称
12             ‘mapping_fields‘=>‘id,name,remark‘//要读取的字段
13         )
14     );
15 }
16 ?>

==============================================================

第三步,控制器使用关联模型、配置文件

使用关联模型的控制器中的代码

1     //用户列表
2     public function index(){
3         header(‘content-type:text/html;charset=utf-8‘);
4         $user=D(‘UserRelation‘)->relation(true)->order(‘id‘)->select();
5         $this->user=$user;
6         $this->display();
7     }

验证权限的控制器Common.class.php中的代码

 1 <?php
 2 //后台登录页
 3 Class CommonAction extends Action{
 4     protected $sess_user;
 5
 6     //后台登录页面
 7     Public function _initialize(){
 8
 9         $sess_uid=$_SESSION[‘uid‘];
10         $sess_uname=$_SESSION[‘username‘];
11         //判断是否存在uid和uname
12         if (!isset($_SESSION[C(‘USER_AUTH_KEY‘)])) {
13             $this->redirect(‘Admin/Login/index‘);
14         }
15
16         //读取session中的变量
17         $this->sess_user=$sess_uname;
18
19         //权限验证
20         //不需要验证的控制器和方法
21        $notAuth=in_array(MODULE_NAME,explode(‘,‘,C(‘NOT_AUTH_MODULE‘))) ||
22         in_array(ACTION_NAME,explode(‘,‘,C(‘NOT_AUTH_ACTION‘)))||
23         C(‘RBAC_SUPERADMIN‘)==$_SESSION[‘username‘];
24         //需要验证的程序
25        if (C(‘USER_AUTH_ON‘)&&!$notAuth) {
26             import(‘ORG.Util.RBAC‘);
27             //读取用户权限
28             RBAC::saveAccessList();//将权限写入$_SESSION[‘_ACCESS_LIST‘]
29             $myauth= RBAC::AccessDecision(GROUP_NAME);//独立分组必填GROUP_NAME
30             $myauth||$this->error(‘没有权限‘,U(‘Admin/Index/main‘));
31        }
32
33
34     }
35
36 }
37
38 ?>

配置文件config.php中的代码

 1     //登录权限管理
 2     ‘RBAC_SUPERADMIN‘=>‘admin‘,         //超级管理员名称
 3     ‘ADMIN_AUTH_KEY‘=>‘superadmin‘,     //超级管理员识别
 4     ‘USER_AUTH_ON‘=>true,               //是否开启验证
 5     ‘USER_AUTH_TYPE‘=>1,                //验证类型(1:登录验证,2:时时验证)
 6     ‘USER_AUTH_KEY‘=>‘uid‘,             //用户认证识别号
 7     ‘NOT_AUTH_MODULE‘=>‘Index‘,              //无需验证的控制器
 8     ‘NOT_AUTH_ACTION‘=>‘loginOut,addUserRun,addRoleRun,addNodeRun‘,              //无需验证的动作方法
 9     ‘RBAC_ROLE_TABLE‘=>‘ad_role‘,       //角色表名称
10     ‘RBAC_USER_TABLE‘=>‘ad_role_user‘,  //角色与用户的中间表名称
11     ‘RBAC_ACCESS_TABLE‘=>‘ad_access‘,   //权限表名称
12     ‘RBAC_NODE_TABLE‘=>‘ad_node‘,       //节点表名称

==============================================================

第四步,模板显示数据

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3     <head>
 4         <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
 5         <link href="__PUBLIC__/css/admin.css" type="text/css" rel="stylesheet"/>
 6         <link href="__PUBLIC__/css/mytable.css" type="text/css" rel="stylesheet"/>
 7     </head>
 8 <body>
 9 <!-- 最高层级 位置显示start -->
10 <table style="margin: 0px; position: fixed;left: 0;top: 0;width: 100%;z-index: 9999;" cellspacing="0" cellpadding="0" width="100%" align="center" border="0">
11     <tr height="28">
12         <td background="__PUBLIC__/images/title_bg1.jpg" style="font-size: 12px;">
13             &nbsp;&nbsp;当前位置:
14         </td>
15     </tr>
16     <tr>
17         <td bgcolor="#b1ceef" height="1">
18         </td>
19     </tr>
20     <tr height="20">
21         <td background="__PUBLIC__/images/shadow_bg.jpg">
22         </td>
23     </tr>
24 </table>
25 <!-- 最高层级 位置显示end  下个盒子加上 style="margin-top: 60px;" -->
26 <table class="bordered" style="margin-top: 60px;">
27     <thead>
28
29     <tr>
30         <th style="text-align:right;">ID</th>
31         <th>用户名称</th>
32         <th>上一次登录时间</th>
33         <th>上一次登录IP</th>
34         <th>锁定状态</th>
35         <th>用户组别</th>
36         <th>操作</th>
37     </tr>
38     </thead>
39     <foreach name=‘user‘ item=‘v‘>
40     <tr>
41
42         <td style="text-align:right;">{$v.id}</td>
43         <td style="text-align:left;">{$v.username}</td>
44         <td style="text-align:right;">{$v.logintime|date=‘Y-m-d H:i‘,###}</td>
45         <td style="text-align:right;">{$v.loginip}</td>
46         <td style="text-align:center;">
47         <if condition="$v[‘lock‘]">
48             <span style="color: red;">已锁定</span>
49         <else/>
50             <span style="color: green;">未锁定</span>
51         </if>
52         </td>
53         <td style="text-align:left;">
54         <if condition="$v[‘username‘] eq C(‘RBAC_SUPERADMIN‘)">
55             <strong>超级管理员</strong>
56         <else/>
57             <ul>
58                 <foreach name=‘v.role‘ item=‘value‘>
59                     <li>{$value.name}({$value.remark})</li>
60                 </foreach>
61             </ul>
62         </if>
63         </td>
64         <td  style="text-align:center;">
65             <a href="#">锁定</a>
66         </td>
67
68     </tr>
69     </foreach>
70
71
72
73 </table>
74 </body>
75 </html>

显示效果

如有更好的实现步骤,请致信邮箱:[email protected](^_^)

时间: 2024-09-29 00:40:55

ThinkPHP中:RBAC权限控制的实习步骤的相关文章

基于thinkphp的RBAC权限控制

RBAC  Role-Based Access Control 权限控制在后台管理中是十分常见的,它的模型大体上是下面这张图的形式 我用的字段和上面不一样,图只是个示例 一个简易的权限控制模型只需要3个表就行了 user表:记录用户的信息和用户的角色 ->user_id:用户的id ->user_role_id:用户的角色信息  0,1,2分别为超级管理员,经理,员工 ->其它省略... role表:记录不同的角色信息,和他们拥有的权限 ->role_id:角色的id    1为经

ThinkPHP操作名权限控制

其实ThinkPHP已经内置了RBAC权限控制,操作也很方便,不过总是感觉平常的小站没有必要用RBAC.有的时候需求很简单,权限控制只检测到操作名上,不细分到方法名上.这样做完全没有必要用RBAC.好处:1.节省时间(有的时候老板定的交工时间是死的)2.懒人你懂的 权限的逻辑很简单,后台给每个用户添加一个字段,暂且命名为Competenct,  然后写一个给用户赋权限的多选框,类似于 每个多选框的值就是当前多选框的操作名,比如你有一个ArticleAction.class.php.那么你的val

&lt;实训|第九天&gt;掌握linux中普通的权限控制和三种特殊的权限(sst),做合格的运维工程师

linux中,权限的学习是必不可少的,不论是作为一名运维工程师或者是单一的管理者,学习好linux中的权限控制,你就可以保护好自己的隐私同时规划好你所管理的一切. 权限的学习是很多的,不要认为自己已经把自己的隐私保护的很好,漏洞总是有的,侧面的攻击往往是难以防守的.所以大家跟我一起学习一下基础的权限控制,在后面也会有更多关于权限控制的知识点分享出来.谢谢各位的关注和支持!  开班第九天: 今天的课程大纲: linux系统中文件目录的基本权限控制 如何来修改默认的生成权限 三种特殊的权限(s,s,

thinkPHP的RBAC权限管理

thinkphp自带一个权限类:RBAC.class.php,里面有生成表的create table语句,也就是它的数据库设计,还有一些方法,比如getAccessList(),可以根据管理员ID号获得权限节点. 1.涉及到的表有五个,为了方便理解,可以总结为: 用户表(user):顾名思义,就是用户了,比如admin.张三.李四.王五 角色表(role):顾名思义,就是定义好的角色,比如财务管理员.文章管理员.产品管理员 用户角色关系表(user_role):顾名思义,就是将用户和角色对应起来

yii2搭建完美后台并实现rbac权限控制案例教程

作者:白狼 出处:www.manks.top/article/yii2_frame_rbac_template 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/config/main-local.php 实际项目中本地的数据库往往跟线上数据库不一致, 我们这里配置到mai

rbac 权限控制

RBAC 的控制,大致是通过将角色的权限控制,来控制用户的权限. 需要构建的表为 用户表(user) ,角色表(role),节点表(node),三张主表 , 节点表内记录的是所有的权限和方法. 2张关联表,是为了关联3张数据表的,分别未 角色用户表(user_role),角色权限表(role_node),也可将两张表写成字段分别加入到用户表和权限表内; 废话不多说看下,键表语句如下 用户表: CREATE TABLE `wj_admin` ( `id` int(11) NOT NULL AUTO

转:RBAC权限控制

名词解释: RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring Security, 一. RBAC 要解决的常见问题 问题一:对某一个用户只授予一些特殊的权限 描述:既不希望扩大某一个角色的权限,也不希望因此创建出很多零碎的.只为一个用户而存在的角色. 问题二:性能问题 描述:B/S 下,菜单.页面.页面元素.dataset的列,这些层层权限判断过于复杂,容易造成系统访问非常缓慢. 问题三:如何减少 HardC

RBAC权限控制

名词解释: RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring Security, 一. RBAC 要解决的常见问题 问题一: 对某一个用户只授予一些特殊的权限 描述:既不希望扩大某一个角色的权限,也不希望因此创建出很多零碎的.只为一个用户而存在的角色. 问题二: 性能问题 描述:B/S 下,菜单.页面.页面元素.dataset的列,这些层层权限判断过于复杂,容易造成系统访问非常缓慢. 问题三: 如何减少 Ha

django中的权限控制

Django默认提供了权限控制,但只能对使用了其自带的登录认证的用户进行权限控制,说白了就是只能对存储在auth_user表中的用户进行权限控制,但不能对未登录过的用户进行权限控制.但如果通过集成LDAP认证后的用户,其用户也会被缓存到该表中,即变相实现了AD用户也能进行权限控制. 权限是auth 应用中定义的Permission类型:User与Permission是many-to-many的关系. Django对于每个模型类,自动增加add.change.delete三种权限,以便于权限控制.