首頁 後端開發 php教程 yii2 RBAC使用DbManager實作後台權限判斷的方法_php實例

yii2 RBAC使用DbManager實作後台權限判斷的方法_php實例

Aug 04, 2016 am 08:56 AM
rbac yii2 後台

本文實例講述了yii2 RBAC使用DbManager實現後台權限判斷的方法。分享給大家參考,具體如下:

首先根據文件產生yii2 框架中的表

yii migrate --migrationPath=@yii/rbac/migrations/

產生如下4表:

auth_assignment
auth_item_child
auth_item
auth_rule

使用yii的gii快速產生對應的model,但由於auth_item表同時儲存角色跟權限,由於後面我們要分角色跟權限來做curd操作,所以我這裡新建了一個RoleForm和PermissionForm兩個model來區分開角色與權限。由於角色跟權限緊緊相連,又在auth_item產生的model中多加一個屬性$child,後面會用到現在先不管。

下面是角色model的相關程式碼

<&#63;php
namespace app\models;
use Yii;
use app\models\AuthItem;
use yii\rbac\Item;
/*
 * 角色model
 * 指尖上的艺术家
 */
class RoleForm extends AuthItem
{
  public function init() {
    parent::init();
    $this->type = Item::TYPE_ROLE;//yii-rbac-Role隐藏继承常量这里的值是1
  }
}

登入後複製

下面是權限model的相關程式碼

<&#63;php
namespace app\models;
use Yii;
use app\models\AuthItem;
use yii\rbac\Item;
/*
 * 权限model
 * 指尖上的艺术家
 */
class PermissionForm extends AuthItem
{
  public function init() {
    parent::init();
    $this->type = Item::TYPE_PERMISSION;//常量值 2
  }
}

登入後複製

另外在AuthItem模型中增加一個屬性

<&#63;php
class AuthItem.....
public $child;//用于角色权限添加
......

登入後複製

現在到我們對應的控制器了

首先我們說權限控制器寫控制器的時候要用到系統自帶的擴充
。 。 。
use yiirbacPermission;
。 。 。

/*
 * 权限添加
 */
public function actionCreate() {
  $model = new PermissionForm();
  if( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
    //rbac中permission对象
    $permission = new Permission();
    $permission->name = trim( $model->name );
    $permission->type = $model->type;
    //权限添加
    Yii::$app->authManager->add( $permission );
  }
}

登入後複製

修改的時候 其他的不變就是換了個方法

/*
 * param string $name 修改的权限名
 * param Object $permission 跟添加一样提交上来的数据
 */
Yii::$app->authManager->update( $name, $permission );

登入後複製

這裡是刪除

//Returns the named permission.
$permission = Yii::$app->authManager->getPermission( $name );
//Removes a permission or rule from the RBAC system.
Yii::$app->authManager->remove( $permission );

登入後複製

權限的cud都搞定了,查看就不寫了

下面是角色控制器

帶上這個

use yii\rbac\Role;
/*
 * 角色添加
 */
public function actionCreate() {
  $model = new RoleForm();
  if ( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
      //实例化角色对象
      $role = new Role();
      $role->name = $model->name;
      $role->type = $model->type;
      //添加角色
      Yii::$app->authManager->add( $role );
  }
  //权限列表( 添加角色的时候我们就可看到当前有没有权限来添加 )
  $permissions = $this->loadPermission();
  //将$model跟$permissions....渲染到视图就好了
}

登入後複製
/*
 * 修改
 * param string $name 修改的角色名
 * param Object $role 跟添加一样提交上来的数据
 */
$bool = Yii::$app->authManager->update( $name, $role );

登入後複製

刪除的時候就比較麻煩了

/*
 * param string $name 角色名
 */
$role = Yii::$app->authManager->getRole( $name );//获取当前角色对象
//Returns the child roles.
$childAll = Yii::$app->authManager->getChildren( $role );
if ( isset($childAll) ) {//逐一删除权限
  foreach ($childAll as $value) {
    //Returns the named permission.
    $perObj = Yii::$app->authManager->getPermission($value);
    //Removes a child from its parent.
    Yii::$app->authManager->removeChild( $role, $perObj );
  }
}
Yii::$app->authManager->remove( $role );//最后删除我们的角色了

登入後複製

最關鍵的就是我們要給角色一個權限對吧,如下程式碼

//当前角色所拥有的权限
$childArray = $this->loadRolePermission( $model->name );//这个就是返回权限数组
if ( !empty( $childArray ) ) {
  $model->child = $childArray;
}
else {
  $model->child = array();
}
//Returns all permissions in the system.
$permissions = Yii::$app->authManager->getPermissions();
$perArr = array();
foreach ($permissions as $key => $value) {
  $perArr[$value->name] = $value->name;
}
if ( $model->load( Yii::$app->request->post() ) && $model->validate() ) {
  //角色对象
  $child = isset( $_POST['AuthItem']['child'] ) &#63; $_POST['AuthItem']['child'] : NULL;
  //表单无法验证child所以当为空的时候跳回原页面
  if ( empty( $child ) ) {
    return $this->redirect(..你们要跳的页面..);
  }
  //判断角色是否分配权限,已分配则删除,反之增加新的
  if ( !empty( $childArray ) ) {
    //Removed all children form their parent.
    $bool = Yii::$app->authManager->removeChildren( $model );
    if ( !$bool ) {
      throw new HttpException(404, '别想糊弄我!凑你一脸~~~');
    }
  }
  //当前角色对象
  $role = Yii::$app->authManager->getRole( $model->name );
  //child权限添加
  if( isset( $child ) ) {
    foreach ( $child as $val) {
      //获取权限
      $childObj = Yii::$app->authManager->getPermission($val);
      //给item_child表写入数据(权限表)
      Yii::$app->authManager->addChild( $role, $childObj );
    }
    return $this->redirect(..你们要跳的页面..);
  }
}

登入後複製

最後就是我們最後一個控制器了角色與使用者關聯

/*
 * 创建角色跟用户之间关联的关键部分代码
 */
//Returns the named role.
$role =Yii::$app->authManager->getRole( $roleName );
// Assigns a role to a user.
Yii::$app->authManager->assign( $role, $userId );<pre name="code" class="php">/*
 * 权限检测
 * param int| string $userId 用户id
 * param string $permission 权限名
 */
Yii::$app->authManager->checkAccess( $userId , $permission ) )

登入後複製

下面是判斷權限的

/*
 * 权限检测
 * param int| string $userId 用户id
 * param string $permission 权限名
 */
Yii::$app->authManager->checkAccess( $userId , $permission ) )

登入後複製

更多關於Yii相關內容有興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php物件導向程式設計入門教程》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教學》及《php常見資料庫操作技巧總表》

希望本文所述對大家以Yii架構為基礎的PHP程式設計有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Discuz後台登入問題解決方法大揭秘 Discuz後台登入問題解決方法大揭秘 Mar 03, 2024 am 08:57 AM

Discuz後台登入問題解決方法大揭秘,需要具體程式碼範例隨著網路的快速發展,網站建置變得越來越普遍,而Discuz作為一款常用的論壇建站系統,受到了許多站長的青睞。然而,正是因為其功能強大,有時候我們在使用Discuz的過程中會遇到一些問題,例如後台登入問題。今天,我們就來大揭秘Discuz後台登入問題的解決方法,並且提供具體的程式碼範例,希望能幫助到有需要

WordPress後台亂碼煩惱?試試這些解決方案 WordPress後台亂碼煩惱?試試這些解決方案 Mar 05, 2024 pm 09:27 PM

WordPress後台亂碼煩惱?試試這些解決方案,需要具體程式碼範例隨著WordPress在網站建置中的廣泛應用,許多用戶可能會遇到WordPress後台亂碼的問題。這種問題會導致後台管理介面顯示亂碼,對使用者的使用帶來極大困擾。本文將介紹一些常見的解決方案,幫助使用者解決WordPress後台亂碼的煩惱。修改wp-config.php檔案開啟wp-config.

Discuz後台帳號登入異常,如何處理? Discuz後台帳號登入異常,如何處理? Mar 09, 2024 pm 05:51 PM

標題:Discuz後台帳號登入異常,如何處理?當你使用Discuz論壇系統的後台管理時,有時候可能會遇到帳號登入異常的情況。這可能是由於多種原因導致的,可能是密碼錯誤、帳號被封鎖、網路連線問題等。在遇到這種情況時,我們需要透過簡單的排查和處理來解決這個問題。檢查帳號和密碼是否正確:首先,確認你輸入的帳號和密碼是否正確。登入時,請確保大小寫輸入正確,密碼是否

yii2 怎麼去掉jquery yii2 怎麼去掉jquery Feb 17, 2023 am 09:55 AM

yii2去掉jquery的方法:1、編輯AppAsset.php文件,註解掉變數$depends裡的「yii\web\YiiAsset」值;2、編輯main.php文件,在欄位「components」下方新增配置為「'yii \web\JqueryAsset' => ['js' => [],'sourcePath' => null,],」即可去掉jquery腳本。

Win11禁止軟體後台運作的方法? Win11禁止軟體後台運作的方法? Jun 30, 2023 am 08:17 AM

win11如何禁止軟體後台運作?我們在使用一些軟體,不使用的時候,就會關掉掉軟體,有些軟體關閉後還會在後台運行,在後台運行的過程中,電腦會造成一定的卡頓,就有小伙伴想知道應該如何在win11中禁止軟體後台運作。小編下面整理了win11禁止軟體後台運作步驟,有興趣的話,跟著小編一起往下看看吧! win11禁止軟體後台運行步驟1、按下快捷鍵“win+X”,在上方給出的選項中選擇“設定”。 2、進入新介面後,點選“應用”,接著找到右側的“應用程式和功能”。 3、其中,找到“Microsoft資訊”,點擊

Discuz後台登入失敗?教你輕鬆解決! Discuz後台登入失敗?教你輕鬆解決! Mar 02, 2024 pm 06:03 PM

Discuz後台登入失敗?教你輕鬆解決!隨著Discuz作為一款流行的論壇平台,在網站搭建和管理中被廣泛使用,有時會遇到後台登入失敗的情況,讓人感到困擾。今天我們就來討論一下可能導致Discuz後台登入失敗的問題,並提供一些解決方案,也會附上具體的程式碼範例。希望本文能幫助遇到類似問題的網站管理員和開發者。 1.問題排查在解決Discuz後台登入失敗的問題之

實現基於角色的存取控制(RBAC):使用PHP和RBAC 實現基於角色的存取控制(RBAC):使用PHP和RBAC Jun 20, 2023 pm 10:39 PM

隨著網路應用的普及,我們希望能夠在應用程式內部實現對資料的保護,以確保敏感資料不會亂用或不被竊取。其中之一的解決方案是使用基於角色的存取控制(RBAC)。基於角色的存取控制(RBAC)是建立在使用者和角色之間的關係上的一種存取控制模型。該模型的核心思想是將使用者的角色與存取控制操作連結起來,而不是將存取控制操作直接與使用者連結。這種方式提高了存取控制的靈活性,

如何正確使用nohup進行背景任務處理 如何正確使用nohup進行背景任務處理 Mar 26, 2024 am 09:39 AM

如何正確使用nohup進行後台任務處理在日常工作中,我們經常需要執行一些耗時較長的任務,例如檔案複製、資料處理等。為了不影響我們的工作效率,並且保證任務能夠在後台穩定運行,我們可以使用nohup命令來啟動這些任務。本文將介紹如何正確使用nohup進行後台任務處理。什麼是nohup指令? nohup是Unix和類別Unix作業系統的一個命令,用於在背景執行命令或腳

See all articles