rbac权限管理 php,用thinkphp5 实现基于角色的访问控制(rbac权限),

详细内容

本篇文章主要讲述了用thinkphp5 实现基于角色的访问控制(rbac权限),分享给大家,方便有需要的朋友参考。

先创建一个数据库;

例如:创建一个test数据库;然后创建3个 表分别为:test_admin (管理员表), test_role,test_auth.

58916c8e907562d52d18d64dd0169215.png

这个是新创建的test库

173510c0f8441a027009836b88d78456.png

管理员表

这个是新创建的admin表, 这个表是用户表是管理后台的用户。

这个表的issuper这个字段代表是否是超级管理员 , 这个超级管理员可以管理全部的角色和执行所有的权限。

admin_role_id 这个字段主要描述的是除了超级管理员之外的管理员所对应的角色表id 下面我们会给出角色表.

a70c9ee298261a478af7f6aea9e7c2a0.png

角色表

这个表是角色表,他的主id 和管理员的admin_role_id可以分出管理员都处于什么角色管理.

f7ac6a1798378c86edade3c712fd00aa.png

权限表

这个表是权限表,他的主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('没有登陆!... ');

}

$resCommon = $res->auth();

if(Request::instance()->isAjax()){

$this->ajaxReturn(['msg'=>'没有操作权限!' , 'code'=>'201'] , 'json');

} else {

$this->error('没有操作权限!...');

}

}

}

}

权限控制

管理员登陆后台 访问属于自己权限的操作业务 , 如果管理员想要越级查看不属于自己权限的业务 , 控制器 会让管理员重定向到自己的操作页面.<?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 中被调用 , 来进行管理员权限等级的判断.

相关教程:PHP视频教程

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值