使用ThinkPHP实现RBAC权限控制必要的几项配置代码


1、RBAC权限控制是根据用户登录成功之后的session中是否有相关节点的权限,所以首先必须得开始session,最好使用数据库存储session信息,建议查看《ThinkPHP自定义SESSION处理DB驱动》。

2、根据ThinkPHP框架中的RBAC.class.php类提供的RBAC必须的数据表sql语句,在命令行中建立相关数据表,代码如下:

CREATE TABLE IF NOT EXISTS `think_access` (
`role_id` smallint(6) unsigned NOT NULL,
`node_id` smallint(6) unsigned NOT NULL,
`level` tinyint(1) NOT NULL,
`module` varchar(50) DEFAULT NULL,
KEY `groupId` (`role_id`),
KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `think_node` (
`id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`title` varchar(50) DEFAULT NULL,
`status` tinyint(1) DEFAULT ‘0’,
`remark` varchar(255) DEFAULT NULL,
`sort` smallint(6) unsigned DEFAULT NULL,
`pid` smallint(6) unsigned NOT NULL,
`level` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `level` (`level`),
KEY `pid` (`pid`),
KEY `status` (`status`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `think_role` (
`id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`pid` smallint(6) DEFAULT NULL,
`status` tinyint(1) unsigned DEFAULT NULL,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pid` (`pid`),
KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `think_role_user` (
`role_id` mediumint(9) unsigned DEFAULT NULL,
`user_id` char(32) DEFAULT NULL,
KEY `group_id` (`role_id`),
KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
3、在Modules文件夹中建立UserRelationModel.class.php类,里边的配置代码如下:

//用户与角色关联模型
class UserRelationModel extends RelationModel{
//定义主表名称
protected $tableName = ‘user’;
//定义关联关系
protected $_link = array(
‘role’=>array(
‘mapping_type’=>MANY_TO_MANY,//多对多关系
‘foreign_key’=>’user_id’,
‘relation_key’=>’role_id’,
‘relation_table’=>’think_role_user’,
‘mapping_fields’=>’id,name,remark’
)
);
}
4、在Action文件夹中建立CommonAction.class.php这个公共类来控制权限,代码如下:

class CommonAction extends Action{
public function _initialize(){
if( !isset($_SESSION[‘uname’]) || !isset($_SESSION[‘uid’]) ){
$this->redirect(‘Admin/Login/index’);
}
$not_auth = in_array(MODULE_NAME, explode(‘,’, C(‘NOT_AUTH_MODULE’))) || in_array(ACTION_NAME, explode(‘,’, C(‘NOT_AUTH_ACTION’)));
if( C(‘USER_AUTH_ON’) && !$not_auth ){
import(‘ORG.Util.RBAC’);
RBAC::AccessDecision(GROUP_NAME) || $this->error(‘没有权限’,U(‘Admin/Index/index’));
}
}
}
5、config.php配置文件中需要添加的代码,可以参考《ThinkPHP中config配置文件详解》。

以上代码仅供参考,其中的配置项名称、数据表名称可以根据自己的实际情况进行修改!

更多信息可以参考《ThinkPHP中关于RBAC使用详解》和《ThinkPHP3.1.3中APP_GROUP_LIST分组后RBAC无权限问题解决办法》。