オリジナルリンク:https://www.cnblogs.com/duanbiaowu/p/5089243.html
表の管理者、ロールテーブル、テーブルメニュー、メニュー権限テーブル:RBAC権限システムのPHPCMSは、主に4つのデータテーブルを使用しています。のは、データベーステーブルのデータ構造を見てみましょう:
管理者管理者のテーブル
ID | フィールド | タイプ | ヌル | デフォルト | 指数 | 追加 | 注記 |
---|---|---|---|---|---|---|---|
1 | ユーザーID | MEDIUMINT(6) | 符号無し | PK | 自動増加 | ユーザーID | |
2 | ユーザ名 | VARCHAR(20) | はい | INDEX | ユーザー名 | ||
3 | パスワード | VARCHAR(32) | はい | パスワード | |||
4 | RoleId | SMALLINT(5) | はい | 0 | 役割 | ||
5 | 暗号化 | VARCHAR(6) | はい | 暗号化の要因 | |||
6 | lastloginip | VARCHAR(15) | はい | 最終ログインIP | |||
7 | lastlogintime | INT(10)符号なし | はい | 0 | 最終ログイン時刻 | ||
8 | Eメール | VARCHAR(40) | はい | Eメール | |||
9 | 本名 | VARCHAR(50) | 番号 | 本名 | |||
10 | カード | VARCHAR(255) | 番号 | 秘密のセキュリティカード |
admin_roleロールテーブル
ID | フィールド | タイプ | ヌル | デフォルト | 指数 | 追加 | 注記 |
---|---|---|---|---|---|---|---|
1 | RoleId | TINYINT(3)符号なし | PK | 自動増加 | ロールID | ||
2 | ロール名 | VARCHAR(50) | 番号 | 役割名称 | |||
3 | 説明 | テキスト | 番号 | 説明 | |||
4 | リストの注文 | SMALLINT(5)符号なし | 番号 | 0 | INDEX | シーケンス | |
5 | 使用禁止 | TINYINT(1)符号なし | 番号 | 0 | INDEX | ステータス:1、無効にします |
メニューメニュー表
ID | フィールド | タイプ | ヌル | デフォルト | 指数 | 追加 | 注記 |
---|---|---|---|---|---|---|---|
1 | ID | SMALLINT(6)の符号なし | PK | 自動増加 | メニューID | ||
2 | 名前 | CHAR(40) | 番号 | 名前 | |||
3 | ParentID | SMALLINT(6) | 番号 | 0 | INDEX | 父のid | |
4 | メートル | CHAR(20) | 番号 | INDEX | メートル | ||
5 | C | CHAR(20) | 番号 | INDEX | C | ||
6 | A | CHAR(20) | 番号 | INDEX | A | ||
7 | データ | CHAR(100) | 番号 | アクセサリーパラメータ | |||
8 | リストの注文 | SMALLINT(6)の符号なし | 番号 | 0 | INDEX | シーケンス | |
9 | 表示 | 列挙型( '1'、 '0') | 番号 | 1 | 、ディスプレイに表示されます |
admin_role_privメニューの権限テーブル
ID | フィールド | タイプ | ヌル | デフォルト | 指数 | 追加 | 注記 |
---|---|---|---|---|---|---|---|
1 | RoleId | TINYINT(3)符号なし | 0 | PK | ロールID | ||
2 | メートル | CHAR(20) | 番号 | INDEX | メートル | ||
3 | C | CHAR(20) | 番号 | INDEX | C | ||
4 | A | CHAR(20) | 番号 | INDEX | A | ||
5 | データ | CHAR(30) | 番号 | 添付ファイルのプロパティ | |||
6 | サイトID | SMALLINT(5)符号なし | 番号 | 0 | INDEX | あなたのサイト |
4つのテーブル間の関係の次の簡単な分析:
1.用户表中的每个用户有一个角色字段roleid,表明了该用户属于哪个角色。
2.角色表的主键为roleid,与用户表中的roleid相对应,还有角色名称,描述等,比如PHPCMS系统默认有超级管理员、总编、发布人员等角色。
3.管理员权限表中主键也是roleid,与角色表中的主键roleid相对应,表明了该角色拥有的后台操作权限。字段m、c、a分别代表的是模型 | 控制器 | 方法,因为PHPCMS本身也是MVC结构,所以更好地使权限系统的粒度细化到方法上面。
4.菜单表主要存放菜单属性,其中的m、c、a与管理员权限表中的字段相对应。
最后来看看用户的操作及验证流程:
首先,用户在后台登录,如果登录成功,将roleid(角色id)存入SESSION,然后跳转到后台首页,在PHPCMS系统中,整个后台操作的部分都在admin模块中,所以该模块中所有的控制器均继承自admin类,并且在构造方法中执行了父类的构造方法(admin的构造方法)。那么,admin类的构造方法有执行了哪些操作呢?
首先是调用自身的 check_admin()
来判断用户是否登录,紧接着判断用户的权限: check_priv()
check_priv() 方法源代码:
## 格式略微修改
final public function check_priv() { if (ROUTE_M == 'admin' && ROUTE_C == 'index' && in_array(ROUTE_A, array('login', 'init', 'public_card'))) { return true; } if ($_SESSION['roleid'] == 1) { return true; } $siteid = param::get_cookie('siteid'); $action = ROUTE_A; $privdb = pc_base::load_model('admin_role_priv_model'); if (preg_match('/^public_/', ROUTE_A)) { return true; } if (preg_match('/^ajax_([a-z]+)_/', ROUTE_A, $_match)) { $action = $_match[1]; } $r = $privdb->get_one( array( 'm' => ROUTE_M, 'c' => ROUTE_C, 'a' => $action, 'roleid' => $_SESSION['roleid'], 'siteid' => $siteid ) ); if (!$r) { showmessage('您没有权限操作该项', 'blank'); } }
该方法首先判断当前正在进行的操作,如果是登录或者初始化操作,则退出。
然后判断角色是否为超级管理员(超级管理员默认为最高权限),如果是,依旧退出,或者如果当前方法为公开的(没有权限限制),同样退出。
最后加载 admin_role_priv_model,也就是管理员权限模型,获取当前要操作的模型 | 控制器 | 方法,利用 admin_role_priv_model 提供的方法进行查询,如果可以返回数据,则说明角色可以进行当前操作,反之,弹出提示信息:您没有权限操作该项,然后退出!
对了,忘了介绍后台菜单的生成过程啦!其实用到的还是admin类自身的方法:admin_menu(): 不过该方法是在 index.tpl.php 模板中调用的,主要进行的操作是先取出菜单表中所有菜单,然后判断当前角色,如果为超级管理员,则直接返回菜单数组,反之,则将符合当前角色权限的菜单数组返回。