小编给大家分享一下用thinkphp5如何实现基于角色的访问控制,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
一
先创建一个数据库;
例如:创建一个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
<?php
namespace app\admin\controller;
use think\Controller;
use think\Url;
use think\Request;
use think\Session;
use app\admin\model\Auth as AuthModel
use app\admin\model\Role as RoleModel
class 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 的内容;
<?php
namspace app\admin\controller;
use think\Controller;
use think\Request;
use app\admin\model\Common 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>');
}
}
}
}
三
权限控制
管理员登陆后台 访问属于自己权限的操作业务 , 如果管理员想要越级查看不属于自己权限的业务 , 控制器 会让管理员重定向到自己的操作页面.
<?php
namespace app\admin\model;
use think\Model;
use think\Db;
use think\Session;
use think\Request;
use app\admin\model\Admin as AdminModel;
use app\admin\model\Role as RoleModel;
use app\admin\model\Auth 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 中被调用 , 来进行管理员权限等级的判断.
以上是用thinkphp5如何实现基于角色的访问控制的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。