多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 知识点 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>&nbsp;&nbsp;|&nbsp;&nbsp; <a href="{:url('modelsField/index',['id'=>$vo.id])}">编辑</a>&nbsp;&nbsp;|&nbsp;&nbsp; <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])); } } ~~~