ThinkPHP中RBAC权限带菜单栏显示和详细权限操作
在Web应用程序开发中,RBAC (Role-Based Access Control) 权限控制是一种广泛采用的访问控制方式。采用RBAC可以为不同的用户角色分配不同的权限,以保证应用程序的安全性。在ThinkPHP框架中,我们可以使用RBAC权限控制组件来进行RBAC权限管理,实现菜单栏显示和详细权限操作。
ThinkPHP中的RBAC权限控制
ThinkPHP中提供了一个RBAC权限控制组件,用于实现RBAC权限管理。RBAC权限控制组件位于 ThinkPHP\Libs\ORG
目录下,包含了 RBAC.class.php
、 Access.class.php
和 Node.class.php
三个类文件。其中, Access.class.php
和 Node.class.php
用于操作RBAC的权限节点和权限控制,而 RBAC.class.php
则实现了Node和Access的管理。
RBAC权限控制步骤概览
下面,我们来看一下使用ThinkPHP中RBAC实现权限控制的步骤概览:
- 创建数据库表来存储权限相关信息
- 增加权限节点
- 为角色分配权限
- 在业务逻辑中检查用户权限
- 在菜单栏中显示用户权限
创建数据库表来存储权限相关信息
首先,我们需要创建如下表用于存储权限相关信息:
-- 存储节点信息
CREATE TABLE `think_node` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
`name` char(80) NOT NULL,
`title` char(20) NOT NULL,
`status` tinyint(1) NOT NULL DEFAULT '1',
`sort` smallint(6) NOT NULL DEFAULT '0',
`pid` mediumint(8) NOT NULL DEFAULT '0',
`level` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- 存储角色信息
CREATE TABLE `think_role` (
`id` smallint(6) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
`status` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- 存储权限信息
CREATE TABLE `think_access` (
`role_id` smallint(6) NOT NULL,
`node_id` mediumint(8) NOT NULL,
`level` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`role_id`,`node_id`),
KEY `role_id` (`role_id`),
KEY `node_id` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
接下来,我们需要在配置文件中设置相关参数,如数据库连接信息和RBAC组件配置信息:
// 默认数据库连接配置参数
'DB_TYPE' => 'mysql',
'DB_HOST' => 'localhost',
'DB_NAME' => 'test',
'DB_USER' => 'testuser',
'DB_PWD' => 'testpassword',
'DB_PORT' => '3306',
// RBAC组件配置参数
'RBAC_DB_DSN' => '', // 数据库连接DSN
'RBAC_ROLE_TABLE' => 'think_role', // 角色表名称
'RBAC_USER_TABLE' => 'think_access', // 用户表名称
'RBAC_NODE_TABLE' => 'think_node', // 节点表名称
'RBAC_ROLE_NODE_TABLE' => 'think_access', // 角色节点关系表名称
'RBAC_ERROR_PAGE' => '', // 无权限访问时跳转页面
'RBAC_SUPERADMIN' => 'admin', // 超级管理员账号
'ADMIN_AUTH_KEY' => 'superadmin', // 超级管理员账号认证识别号
增加权限节点
接下来,我们需要在数据库中增加相应的节点信息。以ThinkPHP自带的一个例子为例,我们在 think_node
表中插入如下数据:
INSERT INTO `think_node` (`id`, `name`, `title`, `status`, `sort`, `pid`, `level`) VALUES
(1, 'Index/index', '首页', 1, 1, 0, 0),
(2, 'List/index', '列表页', 1, 2, 0, 0),
(3, 'List/view', '查看列表', 1, 1, 2, 1),
(4, 'List/add', '添加列表', 1, 2, 2, 1),
(5, 'List/edit', '编辑列表', 1, 3, 2, 1),
(6, 'List/delete', '删除列表', 1, 4, 2, 1),
(7, 'News/index', '新闻列表', 1, 3, 0, 0),
(8, 'News/view', '查看新闻', 1, 1, 7, 1),
(9, 'News/add', '添加新闻', 1, 2, 7, 1),
(10, 'News/edit', '编辑新闻', 1, 3, 7, 1),
(11, 'News/delete', '删除新闻', 1, 4, 7, 1);
这里,我们定义了一些节点,如首页、列表页、查看列表、添加列表、编辑列表、删除列表、新闻列表、查看新闻、添加新闻、编辑新闻、删除新闻。
为角色分配权限
接下来,我们需要根据具体的业务需求,为不同的角色分配不同的权限。我们可以通过以下代码来实现:
import('ORG.Util.RBAC');
// 创建超级管理员
$admin = array(
'username' => 'admin',
'password' => 'adminpassword',
'email' => 'admin@example.com',
'logintime' => time(),
'loginip' => get_client_ip(),
'role_id' => 2
);
$userid = M('User')->add($admin);
// 设置节点和角色关系
$nodes = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); // 全部节点
$role = array(
'name' => '管理员',
'status' => 1,
'nodes' => $nodes // 分配节点
);
$roleid = M('Role')->add($role);
// 为用户分配角色
$user = array(
'role_id' => $roleid,
'user_id' => $userid
);
M('Access')->add($user);
// 更新节点和角色关系
RBAC::saveAccessList(); // 更新缓存
在上述代码中,我们定义了一个拥有所有节点权限的角色,并将其分配给管理员账号 admin
。我们可以根据实际业务需求,自定义不同的角色和权限。
在业务逻辑中检查用户权限
使用RBAC权限控制组件可以轻松地在业务逻辑中检查用户是否具有相应的权限。例如,在 News/edit
页中,我们可以通过以下代码来检查当前用户是否拥有编辑新闻的权限:
if(!RBAC::checkAccess('edit', $_SESSION[C('ADMIN_AUTH_KEY')])) {
// 若无权限,则跳转到无权限页面
$this->error('您没有编辑权限!');
}
在菜单栏中显示用户权限
最后,我们还可以利用RBAC组件在菜单栏中显示当前用户具有的菜单权限。例如,在页面上方添加一个菜单栏:
<div class="menu">
<ul>
<li><a href="<?php echo U('Index/index');?>"<?php echo check_active('Index/index');?>>首页</a></li>
<li><a href="<?php echo U('List/index');?>"<?php echo check_active('List/index');?><?php echo check_access('List/*');?>>列表页</a></li>
<li><a href="<?php echo U('News/index');?>"<?php echo check_active('News/index');?><?php echo check_access('News/*');?>>新闻列表</a></li>
</ul>
</div>
然后,我们可以自定义一个函数来检查当前用户是否具有指定权限。例如:
function check_access($node) {
// 获取当前用户角色信息
$roleid = $_SESSION[C('ADMIN_AUTH_KEY')];
$role = M('Role')->find($roleid);
// 获取节点信息
$nodeid = M('Node')->where(array('name'=>$node))->getField('id');
// 判断当前用户是否具有该节点权限
if(in_array($nodeid, explode(',', $role['nodes']))) {
return '';
} else {
return ' style="display:none;"';
}
}
在上述代码中,我们定义了一个名为 check_access
的函数,它会根据当前用户角色和指定的权限节点信息,来判断当前用户是否具有该节点权限。如果具有,则返回空字符串;否则返回 display:none;
,以控制菜单栏中该节点的显示和隐藏。
综上所述,我们通过以上步骤,就可以在ThinkPHP应用程序中搭建RBAC权限控制系统,实现菜单栏显示和详细权限操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:thinkphp中rbac权限带菜单栏显示和详细权限操作 - Python技术站