この記事では主に、thinkphp5 を使用してロールベースのアクセス制御 (rbac アクセス許可) を実装する方法について説明し、困っている友人の参考にできるように全員と共有します。
一
最初にデータベースを作成します;
例: テスト データベースを作成し、次に 3 を作成します。テーブルは次のとおりです: test_admin (管理者テーブル)、test_role、test_auth。
#これは新しく作成されたテスト ライブラリです##管理者テーブル
これは新しく作成された管理者テーブルです。このテーブルはユーザー テーブルであり、管理バックグラウンドのユーザーです。 このテーブルの issuper フィールドは、スーパー管理者であるかどうかを表します。このスーパー管理者は、すべての役割を管理し、すべての権限を実行できます。 admin_role_id このフィールドは主に、スーパー管理者以外の管理者に対応するロール テーブル ID を記述します。以下にロール テーブルを示します。ロール テーブル
このテーブルはロール テーブルです。彼のメイン ID と管理者の admin_role_id によって、管理者がどのロール管理に属しているかを知ることができます。 # 権限テーブルこのテーブルは権限テーブルであり、そのメイン ID はロール テーブルの role_auth_id に対応します。異なるロールには異なる実行権限があると結論付けることができます。
#二#Web サイトのバックグラウンド管理ページにログインすると、さまざまな管理者がロールとロールの権限を表示します。
Admin.php、Role を作成します。 php と、業務処理用の tinkphp アプリケーションの admin ファイルのモデル層にある Auth.php
次に、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']);
}
}
<?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 で呼び出されます。管理者の権限レベルを決定します。 関連チュートリアル: PHP ビデオ チュートリアル
以上がthinkphp5 を使用してロールベースのアクセス制御 (rbac 権限) を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。