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

时间:2023-03-08 19:38:29
ThinkPHP中:RBAC权限控制的实习步骤

使用版本ThinkPHP3.1.3

第一步,建表及数据

第二步,建关联模型

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

第四步,模板显示数据


第一步,建表及数据

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

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

 # --------------------------------------------------------
# Host: 127.0.0.1
# Server version: 5.0.-community-nt-log
# Server OS: Win32
# HeidiSQL version: 6.0.0.3603
# Date/time: -- ::
# -------------------------------------------------------- /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; # Dumping database structure for companysvn
CREATE DATABASE IF NOT EXISTS `companysvn` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `companysvn`; # Dumping structure for table companysvn.ad_access
CREATE TABLE IF NOT EXISTS `ad_access` (
`role_id` smallint() unsigned NOT NULL,
`node_id` smallint() unsigned NOT NULL,
`level` tinyint() NOT NULL,
`module` varchar() default NULL,
KEY `groupId` (`role_id`),
KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; # Dumping data for table companysvn.ad_access: rows
/*!40000 ALTER TABLE `ad_access` DISABLE KEYS */;
INSERT INTO `ad_access` (`role_id`, `node_id`, `level`, `module`) VALUES
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL),
(, , , NULL);
/*!40000 ALTER TABLE `ad_access` ENABLE KEYS */; # Dumping structure for table companysvn.ad_node
CREATE TABLE IF NOT EXISTS `ad_node` (
`id` smallint() unsigned NOT NULL auto_increment,
`name` varchar() NOT NULL,
`title` varchar() default NULL,
`status` tinyint() default '',
`remark` varchar() default NULL,
`sort` smallint() unsigned default NULL,
`pid` smallint() unsigned NOT NULL,
`level` tinyint() unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `level` (`level`),
KEY `pid` (`pid`),
KEY `status` (`status`),
KEY `name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT= DEFAULT CHARSET=utf8; # Dumping data for table companysvn.ad_node: rows
/*!40000 ALTER TABLE `ad_node` DISABLE KEYS */;
INSERT INTO `ad_node` (`id`, `name`, `title`, `status`, `remark`, `sort`, `pid`, `level`) VALUES
(, 'Admin', '后台应用', , NULL, , , ),
(, 'Index', '前端应用', , NULL, , , ),
(, 'Index', '后台首页', , NULL, , , ),
(, 'MsgManager', '帖子管理', , NULL, , , ),
(, 'Rbac', 'RBAC权限', , NULL, , , ),
(, 'index', '帖子列表', , NULL, , , ),
(, 'delete', '删除帖子', , NULL, , , ),
(, 'index', '用户列表', , NULL, , , ),
(, 'role', '角色列表', , NULL, , , ),
(, 'node', '节点列表', , NULL, , , ),
(, 'addUser', '添加用户', , NULL, , , ),
(, 'addRole', '添加角色', , NULL, , , ),
(, 'addNode', '添加节点', , NULL, , , ),
(, 'Member', '会员中心', , NULL, , , ),
(, 'Index', '前端首页', , NULL, , , ),
(, 'index', '首页面', , NULL, , , ),
(, 'newsList', '新闻列表', , NULL, , , ),
(, 'main', '后台首页', , NULL, , , );
/*!40000 ALTER TABLE `ad_node` ENABLE KEYS */; # Dumping structure for table companysvn.ad_role
CREATE TABLE IF NOT EXISTS `ad_role` (
`id` smallint() unsigned NOT NULL auto_increment,
`name` varchar() NOT NULL,
`pid` smallint() default NULL,
`status` tinyint() unsigned default NULL,
`remark` varchar() default NULL,
PRIMARY KEY (`id`),
KEY `pid` (`pid`),
KEY `status` (`status`)
) ENGINE=MyISAM AUTO_INCREMENT= DEFAULT CHARSET=utf8; # Dumping data for table companysvn.ad_role: rows
/*!40000 ALTER TABLE `ad_role` DISABLE KEYS */;
INSERT INTO `ad_role` (`id`, `name`, `pid`, `status`, `remark`) VALUES
(, 'Manager', NULL, , '普通管理员'),
(, 'Editor', NULL, , '网站编辑');
/*!40000 ALTER TABLE `ad_role` ENABLE KEYS */; # Dumping structure for table companysvn.ad_role_user
CREATE TABLE IF NOT EXISTS `ad_role_user` (
`role_id` mediumint() unsigned default NULL,
`user_id` char() default NULL,
KEY `group_id` (`role_id`),
KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; # Dumping data for table companysvn.ad_role_user: rows
/*!40000 ALTER TABLE `ad_role_user` DISABLE KEYS */;
INSERT INTO `ad_role_user` (`role_id`, `user_id`) VALUES
(, ''),
(, ''),
(, ''),
(, '');
/*!40000 ALTER TABLE `ad_role_user` ENABLE KEYS */; # Dumping structure for table companysvn.ad_user
CREATE TABLE IF NOT EXISTS `ad_user` (
`id` int() unsigned NOT NULL auto_increment,
`username` char() NOT NULL,
`password` char() NOT NULL,
`logintime` int() unsigned NOT NULL,
`loginip` varchar() NOT NULL,
`lock` tinyint() unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT= DEFAULT CHARSET=utf8; # Dumping data for table companysvn.ad_user: rows
/*!40000 ALTER TABLE `ad_user` DISABLE KEYS */;
INSERT INTO `ad_user` (`id`, `username`, `password`, `logintime`, `loginip`, `lock`) VALUES
(, 'admin', '21232f297a57a5a743894a0e4a801fc3', , '127.0.0.1', ),
(, 'wangwu', '9f001e4166cf26bfbdd3b4f67d9ef617', , '127.0.0.1', ),
(, 'zhaoliu', '27311020efc4ce2806feca0aab933fbd', , '127.0.0.1', ),
(, 'lisi', 'dc3a8f1670d65bea69b7b65048a0ac40', , '127.0.0.1', );
/*!40000 ALTER TABLE `ad_user` ENABLE KEYS */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

效果如图:

数据库

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

01-ad_user结构和数据

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

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

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

02-ad_role结构和数据

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

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

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

03-ad_role_user结构和数据

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

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

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

04-ad_node结构和数据

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

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

05-ad_access结构和数据

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

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

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

第二步,建关联模型

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

UserRelationModel.class.php中的代码如下

 <?php
class UserRelationModel extends RelationModel{
//定义主表名称
protected $tableName='user';
//定义关联关系
protected $_link=array(
'role'=>array(
'mapping_type'=>MANY_TO_MANY, //多对多关系
'relation_table'=>'ad_role_user',//中间表名称
'foreign_key'=>'user_id', //主表在中间表中的字段名称
'relation_key'=>'role_id', //副表在中间表中的字段名称
'mapping_fields'=>'id,name,remark'//要读取的字段
)
);
}
?>

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

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

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

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

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

 <?php
//后台登录页
Class CommonAction extends Action{
protected $sess_user; //后台登录页面
Public function _initialize(){ $sess_uid=$_SESSION['uid'];
$sess_uname=$_SESSION['username'];
//判断是否存在uid和uname
if (!isset($_SESSION[C('USER_AUTH_KEY')])) {
$this->redirect('Admin/Login/index');
} //读取session中的变量
$this->sess_user=$sess_uname; //权限验证
//不需要验证的控制器和方法
$notAuth=in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE'))) ||
in_array(ACTION_NAME,explode(',',C('NOT_AUTH_ACTION')))||
C('RBAC_SUPERADMIN')==$_SESSION['username'];
//需要验证的程序
if (C('USER_AUTH_ON')&&!$notAuth) {
import('ORG.Util.RBAC');
//读取用户权限
RBAC::saveAccessList();//将权限写入$_SESSION['_ACCESS_LIST']
$myauth= RBAC::AccessDecision(GROUP_NAME);//独立分组必填GROUP_NAME
$myauth||$this->error('没有权限',U('Admin/Index/main'));
} } } ?>

配置文件config.php中的代码

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

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

第四步,模板显示数据

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<link href="__PUBLIC__/css/admin.css" type="text/css" rel="stylesheet"/>
<link href="__PUBLIC__/css/mytable.css" type="text/css" rel="stylesheet"/>
</head>
<body>
<!-- 最高层级 位置显示start -->
<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">
<tr height="28">
<td background="__PUBLIC__/images/title_bg1.jpg" style="font-size: 12px;">
&nbsp;&nbsp;当前位置:
</td>
</tr>
<tr>
<td bgcolor="#b1ceef" height="1">
</td>
</tr>
<tr height="20">
<td background="__PUBLIC__/images/shadow_bg.jpg">
</td>
</tr>
</table>
<!-- 最高层级 位置显示end 下个盒子加上 style="margin-top: 60px;" -->
<table class="bordered" style="margin-top: 60px;">
<thead> <tr>
<th style="text-align:right;">ID</th>
<th>用户名称</th>
<th>上一次登录时间</th>
<th>上一次登录IP</th>
<th>锁定状态</th>
<th>用户组别</th>
<th>操作</th>
</tr>
</thead>
<foreach name='user' item='v'>
<tr> <td style="text-align:right;">{$v.id}</td>
<td style="text-align:left;">{$v.username}</td>
<td style="text-align:right;">{$v.logintime|date='Y-m-d H:i',###}</td>
<td style="text-align:right;">{$v.loginip}</td>
<td style="text-align:center;">
<if condition="$v['lock']">
<span style="color: red;">已锁定</span>
<else/>
<span style="color: green;">未锁定</span>
</if>
</td>
<td style="text-align:left;">
<if condition="$v['username'] eq C('RBAC_SUPERADMIN')">
<strong>超级管理员</strong>
<else/>
<ul>
<foreach name='v.role' item='value'>
<li>{$value.name}({$value.remark})</li>
</foreach>
</ul>
</if>
</td>
<td style="text-align:center;">
<a href="#">锁定</a>
</td> </tr>
</foreach> </table>
</body>
</html>

显示效果

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

如有更好的实现步骤,请致信邮箱:1465567571@qq.com(^_^)