## 知识点
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
- 窗体操作