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

阅读() @2018-07-15 14:13:38

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无权限问题解决办法》。

微信二维码
锐壳主机