用thinkphp5实现基于角色的访问控制(rbac权限)
内容导读
收集整理的这篇技术教程文章主要介绍了用thinkphp5实现基于角色的访问控制(rbac权限),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5323字,纯文字阅读大概需要8分钟。
内容图文
本篇文章主要讲述了用thinkphp5 实现基于角色的访问控制(rbac权限),分享给大家,方便有需要的朋友参考。一
先创建一个数据库;
例如:创建一个test数据库;然后创建3个 表分别为:test_admin (管理员表), test_role,test_auth.
这个是新创建的test库
管理员表
这个是新创建的admin表, 这个表是用户表是管理后台的用户。
这个表的issuper这个字段代表是否是超级管理员 , 这个超级管理员可以管理全部的角色和执行所有的权限。
admin_role_id 这个字段主要描述的是除了超级管理员之外的管理员所对应的角色表id 下面我们会给出角色表.
角色表
这个表是角色表,他的主id 和管理员的admin_role_id可以分出管理员都处于什么角色管理.
权限表
这个表是权限表,他的主id 所对应的是角色表的role_auth_id 可以得出不同的角色有着不同的权限可以执行.
二
网站后台管理页面登陆不同的管理员对角色和角色权限的显示.
在tinkphp的application的admin文件的model层创建Admin.php,Role.php,Auth.php进行业务处理.
然后在controller层创建index.php
<?phpnamespace appadmincontroller;use thinkController;use thinkUrl;use thinkRequest;use thinkSession;use appadminmodelAuth as AuthModeluse appadminmodelRole as RoleModelclass Index extends CommonController{ public $role; public $auth; public $view;public funtion __construct(){ $this->role = new RoleModel() $this->auth = new AuthModel() $this->view = new View();} publci function auth(){//角色id; $admin_id = sesison('admin_id'); $admin_name = session('admin_name'); $resAdmin = $this->admin->where(['admin_id'=>$admin_id])->select(); if($resAdmin[0]->issuper == 1){//超级管理员拥有全部权限;//一级权限; $authA = $this->auth->where(['auth_level']=>0)->select();//二级权限 $authB = $this->auth->where(['auth_level'=>1])->select();} else { //权限ids; $role_auth_ids = $this->role->where(['role_id'=>$admin_role_id])->select(); $authA = $this->auth->where('auth_level' , 0)->where('auth_id' , 'in' , $role_auth_ids)->select(); $authB = $this->auth->where('auth_level' , 1])->where('auth_id' , 'in' , $role_auth_ids)->select();} $auth = array('authA'=>$authA , 'authB'=>$authB); $this->redirect('admin/'.$auth['authA'][0]->auth_c.'/'.$auth['authA'][0]->auth_a);}public function leftnav(){ $admin_id = session('admin_id'); $amin_name = session('admin_name'); //角色id; $resAdmin = $this->admin->where(['admin_id']=>$admin_id)->select(); $admin_role_id = $resAdmin[0]->$admin_role_id; if($resAdmin[0]->issuper == 1){ //超级管理员super拥有全部权限; //一级权限; $authA = $this->auth->where(['auth_level'=>0])->select(); //二级权限; $authB = $this->auth->where(['auth_level'=>1])->select();} else { //权限ids $role_auth_ids = $this->role->where(['role_id'=>$admin_role_id])->select(); $role_auth_ids = $role_auth_ids[0]->role_auth_ids; $authA = $this->auth->where('auth_level' , 0)->where('auth_id' , 'in' , $role_auth_ids)->select(); $authB = $this->auth->where('auth_level' , 1)->where('auth_id' , 'in' , $role_aut_ids)->select();} $auth = array('authA'=>$authA , 'authB'=>$authB); $this->view->assign('authA' , $auth['authA']); $this->view->assign('authB' , $auth['authB']);} }
现在我来解释一下上面auth方法的作用是用来重定向的如果登陆的管理者向url地址输入了不属于他的权限的地址我们会让他重定向到他自己的管理页面.
还有继承的CommonController 的内容;
<?phpnamspace appadmincontroller;use thinkController;use thinkRequest;use appadminmodelCommon as Controller{ public function __construct(){ parent::__construct(); $res = new CommonModel(); $resquest = Request::instance(); if(session('admin_id') == null){ if(strtolower($resquest->controller()) == 'index' && strtolower($resquest->action()) == 'login'){ return true;} else { $this->error('没有登陆!<br /><span style="color:gray;">...</span> ');} $resCommon = $res->auth(); if(Request::instance()->isAjax()){ $this->ajaxReturn(['msg'=>'没有操作权限!' , 'code'=>'201'] , 'json');} else { $this->error('没有操作权限!<br><span style="color:gray;">...</span>');}}}}
三
权限控制
管理员登陆后台 访问属于自己权限的操作业务 , 如果管理员想要越级查看不属于自己权限的业务 , 控制器 会让管理员重定向到自己的操作页面.
<?phpnamespace appadminmodel;use thinkModel;use thinkDb;use thinkSession;use thinkRequest;use appadminmodelAdmin as AdminModel;use appadminmodelRole as RoleModel;use appadminmodelAuth as AuthModel;class Common extends Model{ public function auth() { //当前控制器和操作方法; $request= Request::instance(); $auth_ac = strtolower(trim($request->controller())).'/'.strtolower(trim($request->action())); //var_dump($auth_ac); $auth = array(); $res = new AdminModel(); $resRole = new RoleModel(); $resAuth = new AuthModel(); $resAdmin = $res->where(['admin_id'=>session('admin_id')])->select(); //非超级管理员控制权限; if($resAdmin[0]->issuper != 1){ $admin_role_id = $resAdmin[0]->admin_role_id; //$admin_role_id = $info['admin_role_id']; //$info = $this->info('Role' , ['role_id'=>$admin_role_id] , 'role_auth_ids'); $info = $resRole->where('role_id' , $admin_role_id)->select(); $role_auth_ids = $info[0]->role_auth_ids; $infos = $resAuth->where('auth_id' , 'in' , $role_auth_ids)->select(); //$infos = $this->infos('Auth' , ['auth_id'=>['in' , $role_auth_ids] , 'auth_level'=>1] ,'auth_c , auth_a' ); foreach($infos as $key=>$val){ $auth[] = $val['auth_c'].'/'.$val['auth_a']; } $result = array_merge($auth , ['index/auth'] , ['index/login']); //var_dump($result); if(in_array($auth_ac , $result)){ return true; } else { return false; } } else { return true; } }}
上面的CommonModel 在CommonController 中被调用 , 来进行管理员权限等级的判断.
相关教程:PHP视频教程
以上就是用thinkphp5 实现基于角色的访问控制(rbac权限)的详细内容,更多请关注Gxl网其它相关文章!
内容总结
以上是为您收集整理的用thinkphp5实现基于角色的访问控制(rbac权限)全部内容,希望文章能够帮你解决用thinkphp5实现基于角色的访问控制(rbac权限)所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。