基於thinkphp3.2.3開發的CMS內容管理系統(二)- Rbac用戶權限

基於thinkphp3.2.3開發的CMS內容管理系統

thinkphp版本:3.2.3

功能:

–分類欄目管理

–文章管理

–商品管理

–用戶管理

–角色管理

–權限管理

–友情鏈接管理

–系統設置

目前占時這些功能,更多功能還在開發中…

此次版本新增的有:商品管理、角色管理、權限管理

 

本篇文章我們主要來看看,Rbac用戶權限

 

RBAC(Role-Based Access Controll)基於角色的訪問控制

在 ThinkPHP3.2.3 中 RBAC 類位於 /ThinkPHP/Library/Org/Util/Rbac.class.php

 

一、Rbac原理和數據表:

       在後台管理模塊中,每個用戶都屬於相應的角色組,例如用戶 admin 屬於超級管理員角色組,用戶 dee 屬於普通管理員角色組,用戶 jane 屬於銷售角色組,用戶 nicole 屬於財務角色組,每個角色組擁有的權限都不同。用戶和角色組屬於多對多的關係,即一個用戶可能屬於多個角色組,一個角色組有多個用戶。

       所有模塊(例如 Home、Admin)、控制器(Controller)、方法(Action)都是節點,角色組是否能夠訪問這些節點的信息即是該角色組的權限信息。角色組和節點也是多對多的關係,即一個角色組可以訪問多個節點,多個角色組都有可以訪問同一個節點。

即 Rbac 功能需要 5 張數據表:用戶表、角色表、用戶-角色中間表、節點表、角色-節點中間表(權限表)。在 Rbac.class.php 中系統已經給出了其中的 4 張表:角色表(role)、用戶-角色中間表(role_user)、節點表(node)、權限表(access):

/*
-- --------------------------------------------------------
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;
*/

 

需要自己創建一張用戶表:

CREATE TABLE `crm_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` char(20) NOT NULL DEFAULT '',
  `password` char(32) NOT NULL DEFAULT '',
  `logintime` int(10) unsigned NOT NULL,
  `loginip` varchar(30) NOT NULL,
  `lock` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

數據模型如下:

 

 

基本的原理是,在配置文件中配置用戶登錄的識別號,這個識別號是用戶的 id,在用戶進行登陸的時候把 id 存儲在 Session 中,同時根據 Session 保存的識別號通過連表查詢獲取該用戶所屬角色所能訪問的節點信息並做判斷。

二、配置選項 

在 Rbac.class.php 中給出了需要配置的信息:

// 配置文件增加設置
// USER_AUTH_ON 是否需要認證
// USER_AUTH_TYPE 認證類型
// USER_AUTH_KEY 認證識別號
// REQUIRE_AUTH_MODULE  需要認證模塊
// NOT_AUTH_MODULE 無需認證模塊
// USER_AUTH_GATEWAY 認證網關
// RBAC_DB_DSN  數據庫連接DSN
// RBAC_ROLE_TABLE 角色表名稱
// RBAC_USER_TABLE 用戶表名稱
// RBAC_ACCESS_TABLE 權限表名稱
// RBAC_NODE_TABLE 節點表名稱

在模塊配置文件 ./Application/Admin/Conf/config.php 中添加:

//'配置項'=>'配置值'
     'SHOW_PAGE_TRACE'=>true,  //顯示頁面調試Trace信息,默認為false
    //Rbac權限訪問控制配置
    'RBAC_SUPERADMIN'=>'admin',         //超級管理員名稱
    'ADMIN_AUTH_KEY'=>'admin',     //超級管理員識別,存放在Session中
    'USER_AUTH_ON'=>ture,               //是否開啟權限認證,false,ture
    'USER_AUTH_TYPE'=>1,                //驗證類型 1-登陸時驗證 2-實時驗證
    'USER_AUTH_KEY'=>'admin_id',        //存儲在session中的用戶識別號ID
    'NOT_AUTH_MODULE'=>'Index',         //無需驗證的控制器
    'NOT_AUTH_ACTION'=>'index',          //無需驗證的方法
    'RBAC_ROLE_TABLE'=>'blog_role',      //角色表名稱
    'RBAC_USER_TABLE'=>'blog_role_user', //角色與用戶的中間表名稱(注意)
    'RBAC_ACCESS_TABLE'=>'blog_access',  //權限表名稱
    'RBAC_NODE_TABLE'=>'blog_node',      //節點表名稱

 

三、開發實例

需要開發以下功能,順序是:

①【添加角色 → 角色列表】 →

②【添加節點 → 節點列表】 →

③【權限列表 → 分配權限】 →

④【添加用戶 → 用戶列表 】 →

⑤【Rbac 配置】→

⑥【登陸】

 

步驟開始:

①【添加角色 → 角色列表】 →

在後台模塊新建 Rbac 控制器:./Application/Admin/Controller/Rbac.class.php

//角色管理
    public function role(){
        $role = M('Role'); // 實例化對象
        $count      = $role->where('status=1')->count();// 查詢滿足要求的總記錄數
        $Page       = new \Think\Page($count,25);// 實例化分頁類 傳入總記錄數和每頁顯示的記錄數(25)
        $show       = $Page->show();// 分頁顯示輸出
        // 進行分頁數據查詢 注意limit方法的參數要使用Page類的屬性
        $list = $role->where('status=1')->order('id')->limit($Page->firstRow.','.$Page->listRows)->select();
        //var_dump($list);exit;
        $this->assign('list',$list);// 賦值數據集
        $this->assign('page',$show);// 賦值分頁輸出
        $this->display(); // 輸出模板
    }

    //角色添加
    public function role_add(){
        if(IS_POST){
            $m = M("Role");
            $data = $m->create();
            $res  = $m->add($data);
            if($res>0){
                $this->success('添加成功!',U('role'));
            }else{
                $this->error('添加失敗!');
            }
            return;
        }
        $this->display();
    }

 
    //角色禁用
    public function role_delete(){
        $m  = M('Role');
        $id = $_GET['id'];
        $res = $m->where("id = {$id}")->setField('status',0);
        if($res>0){
            $this->success('角色已禁用!',U('role'));
        }else{
            $this->error('禁用失敗!');
        }
    }

 

 

③【權限列表 → 分配權限】 →

 

 

②【添加節點 → 節點列表】 →

 

 

 

 

時間比較倉促,功能可能不太完善,後面會慢慢修改;

後台比較簡單,功能不太完整,後續還在陸續增加功能,希望各位大神指點~

 

 

 

 

 

 

 

 

日期:2020.5.5

作者:賴忠標

坐標:廣州

 

上一篇文章:基於thinkphp3.2.3開發的CMS內容管理系統(一)