PHP-RBAC單角色設計-最簡單的設計方案

MC811-MM118發表於2021-06-02

三表構成許可權關聯,在PHP應該是最簡單的許可權設計方案了:
ps:如果有同學也想要聯絡,避免重複造輪子,我可以提供下面sql檔案哦!
1、選單管理

2、角色管理

3、使用者管理

Mysql表設計:

  1. s_menu 選單表

    複製程式碼

    +————+——————+——+—–+———+—————-+
    | Field | Type | Null | Key | Default | Extra |
    +————+——————+——+—–+———+—————-+
    | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
    | pid | int(11) | YES | | 0 | |父級id
    | crd | int(11) | YES | | 0 | |排序
    | title | varchar(20) | YES | | NULL | |名稱
    | controller | varchar(30) | YES | | NULL | |控制器
    | method | varchar(30) | YES | | NULL | |方法
    | ishidden | tinyint(1) | YES | | 0 | |0:顯示 1:隱藏
    | status | tinyint(1) | YES | | 0 | |0:正常 1:禁用
    | type | tinyint(1) | YES | | 0 | |0:系統1 1:系統2(如果單個系統則不需要此欄位)
    +————+——————+——+—–+———+—————-+

    複製程式碼

  2. s_group 角色表

    複製程式碼

    +——–+——————+——+—–+———+—————-+
    | Field | Type | Null | Key | Default | Extra |
    +——–+——————+——+—–+———+—————-+
    | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
    | title | varchar(30) | YES | | NULL | |角色標題
    | rights | text | YES | | NULL | |許可權組,存s_menu表id的json陣列
    +——–+——————+——+—–+———+—————-+

    複製程式碼

  3. s_user 使用者表

    複製程式碼

    +———-+——————+——+—–+———+—————-+
    | Field | Type | Null | Key | Default | Extra |
    +———-+——————+——+—–+———+—————-+
    | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
    | user | varchar(20) | YES | | NULL | |使用者名稱
    | pass | varchar(100) | YES | | NULL | |密碼
    | truename | varchar(20) | YES | | NULL | |真實姓名
    | gid | int(11) unsigned | YES | | NULL | |角色表 id
    | gid_view | int(11) unsigned | YES | | NULL | |角色表2 id(意思是一個使用者擁有兩套系統的角色許可權,如果單個系統則不需要此欄位)
    | status | tinyint(4) | NO | | 0 | |使用者狀態 0:正常 1:禁用
    | add_time | int(11) | YES | | NULL | |新增時間
    +———-+——————+——+—–+———+—————-+

    複製程式碼

原理:

  1. s_menu表間儲存類檔案的控制器、方法、選單名稱,子級選單的pid為父級選單的id進行儲存,一級選單pid預設為0,便於自定義選單的遍歷渲染

    複製程式碼

    +—-+——+——+—————+————+——–+———-+——–+——+
    | id | pid | crd | title | controller | method | ishidden | status | type |
    +—-+——+——+—————+————+——–+———-+——–+——+
    | 1 | 0 | 7 | 安全 | | | 0 | 0 | 0 |
    | 2 | 1 | 0 | 使用者管理 | User | index | 0 | 0 | 0 |
    | 3 | 1 | 1 | 角色管理 | Role | index | 0 | 0 | 0 |
    | 4 | 1 | 2 | 表單-選單管理 | Menu | index | 0 | 0 | 0 |
    | 5 | 2 | 0 | 使用者新增 | User | add | 1 | 0 | 0 |
    | 6 | 2 | 0 | 使用者儲存 | User | save | 1 | 0 | 0 |
    | 7 | 2 | 0 | 使用者編輯 | User | edit | 1 | 0 | 0 |
    | 8 | 2 | 0 | 使用者修改 | User | update | 1 | 0 | 0 |
    | 9 | 2 | 0 | 使用者刪除 | User | delete | 1 | 0 | 0 |
    | 10 | 3 | 0 | 角色新增 | Role | add | 1 | 0 | 0 |
    +—-+——+——+—————+————+——–+———-+——–+——+

    複製程式碼

    如:安全下面有【使用者管理】、【角色管理】、【表彰-選單管理】3個子選單

  2. s_group表將多個s_menu_id形成json陣列繫結角色名稱

    +—-+———-+—————————————————————————–+
    | id | title | rights |
    +—-+———-+—————————————————————————–+
    | 12 | 視覺設計 | [46,51,59,60,67,92,126,127,272,273,213,214,215,263,268,271,275,317,318,264] |
    | 14 | 財務 | [92,126,127,212,113,115,226,216,217,263,268,264] |
    +—-+———-+—————————————————————————–+

  3. s_user繫結有角色組的id,當php登入後獲取使用者表id,就可查詢到是否有當前訪問的控制器的方法許可權

    複製程式碼

    +—-+——–+———————————-+———-+——+———-+——–+————+
    | id | user | pass | truename | gid | gid_view | status | add_time |
    +—-+——–+———————————-+———-+——+———-+——–+————+
    | 1 | xxx | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | xxx | 1 | 2 | 0 | 1236456622 |
    | 12 | xxx | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | xxx | 7 | 4 | 0 | 1546313958 |
    | 13 | xxx | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | xxx | 9 | 4 | 0 | 1546313989 |
    | 14 | xxx | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | xxx | 10 | 3 | 0 | 1546314013 |
    | 15 | xxx | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | xxx | 16 | 3 | 0 | 1546314060 |
    +—-+——–+———————————-+———-+——+———-+——–+————+

本作品採用《CC 協議》,轉載必須註明作者和本文連結
如果覺得我寫的不錯,記得和我交流,其實我也有很多不懂,嘻嘻!

相關文章