使用版本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 */;

效果如图:

数据库

01-ad_user结构和数据

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

02-ad_role结构和数据

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

03-ad_role_user结构和数据

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

04-ad_node结构和数据

05-ad_access结构和数据

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

第二步,建关联模型

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>

显示效果

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

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

  1. yii2 rbac权限控制详细操作步骤

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...

  2. ThinkPHP中RBAC权限带菜单栏显示和详细权限操作

    RBAC是什么,能解决什么难题? RBAC是Role-Based Access Control的首字母,译成中文即基于角色的权限访问控制,说白了也就是用户通过角色与权限进行关联[其架构灵感来源于操作系 ...

  3. ThinkPHP的Rbac权限控制

    RBAC(Role-Based Access Controll)基于角色的访问控制 在 ThinkPHP3.2.3 中 RBAC 类位于 /ThinkPHP/Library/Org/Util/Rbac ...

  4. 基于thinkphp的RBAC权限控制

    RBAC  Role-Based Access Control 权限控制在后台管理中是十分常见的,它的模型大体上是下面这张图的形式 我用的字段和上面不一样,图只是个示例 一个简易的权限控制模型只需要3 ...

  5. ThinkPHP中RBAC权限管理的简单应用

    RBAC英文全称(Role-Based Access Controller)即基于角色的权限访问控制,简单来讲,一个用户可以拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授 ...

  6. yii2 rbac权限控制之菜单menu详细教程

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

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

    1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 或者参考yii2实战教程之详细安装步骤 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/con ...

  8. Kubernetes-16:一文详解ServiceAccount及RBAC权限控制

    一.ServiceAccount 1.ServiceAccount 介绍 首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务账户) ...

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

    linux中,权限的学习是必不可少的,不论是作为一名运维工程师或者是单一的管理者,学习好linux中的权限控制,你就可以保护好自己的隐私同时规划好你所管理的一切. 权限的学习是很多的,不要认为自己已经 ...

随机推荐

  1. MyEclipse简介

  2. 为什么会需要消息队列(MQ)?

    为什么会需要消息队列(MQ)? #################################################################################### ...

  3. 201521123015 《Java程序设计》第七周学习总结

    1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下: public boolean contains(Object ...

  4. 201521123032 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1. clone方法 1.1 Object ...

  5. 201521123034《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 多线程的冲突 互斥共享(有时两个或两个以上的线程需要同时对 而线程之间如果不加以控制,会产生一种情况-竞争) sy ...

  6. 201521123002《Java程序设计》第12周学习总结

    本次作业参考文件 正则表达式参考资料 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. FileinputStream,FileoutputStream //字 ...

  7. 201521123033《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  8. 201521123066 《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synch ...

  9. PHP封装数据库连接

    将数据库连接放在类里面,用的时候直接实例化类. 将数据库地址,用户名,密码做成成员变量 将数据库连接做成成员方法,通过传入的sql语句返回结果集对象 class DBDA{ public $host= ...

  10. JSP第二篇【内置对象的介绍、4种属性范围、应用场景】

    什么是JSP内置对象 JSP引擎在调用JSP对应的jspServlet时,会传递或创建9个与web开发相关的对象供jspServlet使用.JSP技术的设计者为便于开发人员在编写JSP页面时获得这些w ...