## 知識點
1、權限理解
2、工作準備
3、角色管理
4、添加新角色
5、刪除角色
6、編輯角色
[TOC]
## 一、權限理解
權限訪問控制有兩個思路,一是RBAC,一個是auth
但Auth更靈活,凡是RBAC能做到的Auth都能做到,所以建議用Auth
### (一)RBAC
RBAC基于角色的訪問控制,RBAC支持三個著名的安全原則:最小權限原則,責任分離原則和數據抽象原則。
RBAC認為權限授權實際上是Who、What、How的問題。
在RBAC模型中,who、what、how構成了訪問權限三元組,也就是“Who對What(Which)進行How的操作”。
基于角色的權限訪問控制(Role-Based Access Control)作為傳統訪問控制(自主訪問,強制訪問)的有前景的代替受到廣泛的關注。
在RBAC中,權限與角色相關聯,用戶通過成為適當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。
在一個組織中,角色是為了完成各種工作而創造,用戶則依據它的責任和資格來被指派相應的角色,用戶可以很容易地從一個角色被指派到另一個角色。
角色可依新的需求和系統的合并而賦予新的權限,而權限也可根據需要而從某角色中回收。角色與角色的關系可以建立起來以囊括更廣泛的客觀情況。
### (二)Auth權限管理
Auth權限管理比RBAC更加靈活,auth對權限的控制更為精細。
Auth的特性:
1、是對規則進行認證,不是對節點進行認證。用戶可以把節點當作規則名稱實現對節點進行認證。
auth=newAuth();auth=newAuth();auth->check(‘規則名稱’,’用戶id’)
2、可以同時對多條規則進行認證,并設置多條規則的關系(or或者and)。
auth=newAuth();auth=newAuth();auth->check(‘規則1,規則2’,’用戶id’,’and’)
3、一個用戶可以屬于多個用戶組(think_auth_group_access表 定義了用戶所屬用戶組),
我們需要設置每個用戶組擁有哪些規則(think_auth_group 定義了用戶組的權限)。
4、支持規則表達式。在think_auth_rule 表中定義一條規則時,如果type為1, condition字段就可以定義規則表達式。
如定義{score}>50 and {score}<100 表示用戶的分數在50-100之間時這條規則才會通過。
參考網址:https://blog.csdn.net/lamp_yang_3533/article/details/78242945
## 二、工作準備
### (一)建立數據表
用戶表:sfox_user
用戶組(用戶角色)表:sfox_auth_group
關聯表:sfox_auth_group_access
規則表:sfox_auth_rule
用戶ID對應哪個角色,而角色擁有相應的權限
### (二)引入Auth類庫
位置:\extend\util\Auth.php
配置:
~~~
protected $_config = array(
'auth_on' => true, // 認證開關
'auth_type' => 1, // 認證方式,1為實時認證;2為登錄認證。
'auth_group' => 'auth_group', // 用戶組數據表名
'auth_group_access' => 'auth_group_access', // 用戶-用戶組關系表
'auth_rule' => 'auth_rule', // 權限規則表
'auth_user' => 'user' // 用戶信息表
);
~~~
### (三)添加用戶、角色和規則控制器
'User', 'Authrole', 'Authrule'
### (四)添加角色相關模板
'authrole/index','authrule/index','user/index'
### (五)后臺添加菜單
圖標:fa-cog
權限管理》
角色管理:authrole
規則管理:authrule
用戶管理:user
### (六)控制器引入相關類庫
use think\Controller;
use think\Db;
## 三、角色管理
### (一)操作
~~~
public function index($id=0, $tab=1){
//獲取角色信息
$authrolelist = Db::name('auth_group')->order('id')->select();
$this->assign('authrolelist',$authrolelist);
return view();
}
~~~
### (二)模板
~~~
{volist name="authrolelist" id="vo"}
<tr>
<td>{$vo.id}</td>
<td>{$vo.title}</td>
<td>{$vo.remark}</td>
<td>{$vo.status? '√' : '?'}</td>
<td>
<a href="{:url('index',['tab'=>3,'id'=>$vo.id])}">權限設置</a> |
<a href="{:url('modelsField/index',['id'=>$vo.id])}">編輯</a> |
<a name="delete" href="{:url('delete',['id'=>$vo.id,'tablename'=>$vo.tablename])}">刪除</a>
</td>
</tr>
{/volist}
~~~
## 四、添加新角色
### 1、模板
這個簡單,不作詳述
### 2、操作
~~~
public function add(){
if(request()->isPost()){
$data = input('post.');
if(trim($data['title']=='')){
return error('角色名稱不能為空!');
exit();
}
//添加新角色
Db::name('auth_group')->strict(false)->insert($data);
return success('新角色添加成功!',url('index',['tab'=>1]));
}
}
~~~
### 3、數據表字段不存在[tab]
原因分析:TP5對數據表字段,默認檢查是嚴格的,所以,要么去嚴格檢查,要么刪除該字段在插入或者更新數據
解決辦法:
在Db類中,用strict(false)即可
在模型中,allowField(true)
Db::name('auth_group')->strict(false)->insert($data);
$this->allowField(true)->save($data)
## 五、刪除角色
~~~
模板
<a name="delete" href="{:url('delete',['id'=>$vo.id])}">刪除</a>
操作
public function delete($id = 0){
if(Db::name('auth_group')->where('id', $id)->delete()){
return success('刪除成功!',url('index',['tab'=>1]));
}else{
return error('刪除失敗!',url('index',['tab'=>1]));
}
}
~~~
## 六、編輯角色
Db類編輯update
Db類新增insert
### 1、模板鏈接
~~~
<form method="post" class="form-horizontal" action="{:url('authrole/index')}" data-type="ajax">
<a href="{:url('index',['id'=>$vo.id,'tab'=>3])}">編輯</a>
</form>
~~~
### 2、顯示編輯tab
~~~
public function index($id=0, $tab=1){
//獲取角色信息
$authrolelist = Db::name('auth_group')->order('id')->select();
$this->assign('authrolelist',$authrolelist);
// 編輯角色
if(3==$tab){
$info = Db::name('auth_group')->where('id',$id)->find();
if($info!=null && is_array($info)){
$this->assign('info',$info);
}
}
return view();
}
~~~
### 3、編輯操作
~~~
public function edit(){
if(request()->isPost()){
$data = input('post.');
if(trim($data['title']=='')){
return error('角色名稱不能為空!');
exit();
}
//編輯新角色
Db::name('auth_group')->strict(false)->update($data);
return success('角色編輯成功!',url('index',['tab'=>1]));
}
}
~~~
- Layer無刷新不跳轉彈框提示信息
- 整合ThinkPHP+實用代碼
- TP整合Layer插件實現無刷新
- 自定義助手函數
- 添加信息失敗后不跳轉
- 三種無限級分類
- TP常用代碼
- 自定義公共函數
- TP模型管理專題
- TP模型管理之添加模型
- sfox_newmodel.sql
- TP模型管理之刪除模型
- TP模型管理之編輯模型
- TP模型管理之字段添加
- sfox_newmodel.sql_edit
- layer_hplus.js_edit
- TP模型管理之字段刪除
- TP模型管理之字段編輯
- TP模型管理之預覽模型
- TP模型管理之公共函數
- layer_hplus.js_修訂一
- TP模型管理之預覽模型靜態頁
- 后臺內容管理系統
- 分類樹顯示
- 內容列表顯示
- 信息發布
- 編輯信息
- layer_hplus.js
- myJs第一版
- myJs第二版
- myJs第三版
- myJs第四版
- TP5插件用法
- Datatables
- WebUploader
- bootstrap-fileinput
- UEditor
- 簡單調用
- 路徑問題
- 跨域多圖上傳
- 跨域單圖上傳
- UEditor圖片跨域上傳解決方案
- 定制工具欄圖標
- ajaxFileUpload
- LayUI
- 圖片上傳
- layui分頁
- 搜索頁
- 搜索優化及刪除
- Uploadify
- TP5前端應用
- 靜態首頁
- 前臺首頁功能實現
- 自定義標簽庫
- 前臺模板繼承應用
- 首頁自定義標簽改進
- 文章內容頁
- 自定義標簽改進
- 自定義標簽修正
- 圖片等比例自動縮放
- 后臺權限管理
- 角色管理
- 規則管理
- 權限設置
- 會員管理
- 權限管理
- 前臺登錄注冊功能
- 注冊登錄
- 阿里大于手機注冊
- 阿里大于升級阿里云短信服務
- 自動登錄完成
- PHP異位或加密實現自動登陸
- 微信開發
- 分享接口
- 靜態頁面實現微信分享
- 動態頁微信分享
- 頁面靜態化
- 1-全站靜態化前期配置
- 2-鏈接地址靜態化
- TP5常用片段代碼
- 加載靜態資源路徑與常量
- thinkphp5預定義常量
- 刪除某文件夾的內容
- 解壓插件包
- 異步提交插件
- 其他功能
- 背景音樂
- 手機訪問PC網站自動跳轉到手機網站代碼
- 手機微信音樂MP3播放器
- 后盾之網頁背景音樂
- 播放器寬度自適應
- 前臺首頁數據調用
- 視頻列表
- 搜索分頁
- H5解決蘋果(IOS)不能自動播放音樂
- 清空緩存
- 文件處理常識
- 刪除路徑下的所有文件夾和文件
- 一鍵清空緩存
- 評論留言
- 格式化時間
- 替換微博內容的URL地址@用戶與表情
- PHP正則理解
- jQuery評論插件
- TP空操作
- TP路由
- 跨域訪問
- 設置請其頭允許跨域請求
- 模板前臺判斷手機訪問跳轉手機網址代碼
- PHP遍歷一個文件夾下所有文件和子文件夾
- PHP獲取視頻的第一幀與時長
- TP5數據庫
- 鏈式操作原理
- update替換字段部分內容
- 后臺開發
- 后臺登錄頁居中顯示
- TP5自帶驗證碼
- JS & JQuery專題
- 二級城市聯動菜單
- 模板引擎
- 混合模板編譯
- 黃永成TP微博開發
- 消息推送
- memcache安裝
- 插件開發
- 插件介紹
- 插件鉤子
- 淺談初步理解鉤子
- 插件鉤子(hooks)分析
- 插件鉤子簡單理解
- 控制器調用插件
- 鉤子通用處理函數
- 插件基類代碼
- 插件測試代碼
- 淺談鉤子與插件
- 技術綜合
- 常用代碼
- PHP
- 56個PHP開發常用代碼片段(上)
- 56個PHP 開發常用代碼片段(中)
- 56個PHP 開發常用代碼片段(下)
- sublime text安裝自動補全注釋的插件
- 影音視頻開發
- 視頻
- H5視頻直播掃盲
- 音樂
- 語音
- PHP實現語音播報功能
- MUI
- 窗體操作