Yii中使用RBAC完全指南

2021-08-30 07:29:11 字數 4344 閱讀 2257

寫得不錯,因為yii的文件還缺少一些實際的例子,所以不是那麼容易看懂,看了這篇就完全搞清楚了!

九月 10, 2009 - posted by 東至

寫在前面

* 以下內容適合yii 1.0.x,其他版本可能有略微的差別。

開始準備

yii提供了強大的配置機制和很多現成的類庫。在yii中使用rbac是很簡單的,完全不需要再寫rbac**。所以準備工作就是,開啟編輯器,跟我來。

設定引數、建立資料庫

在配置陣列中,增加以下內容:

『components『 => array(

//……

『authmanager『=>array(

『class『=>『cdbauthmanager『,//認證類名稱

『defaultroles『=>array(『guest『),//預設角色

『itemtable『 => 『pre_auth_item『,//認證項表名稱

『itemchildtable『 => 『pre_auth_item_child『,//認證項父子關係

『assignmenttable『 => 『pre_auth_assignment『,//認證項賦權關係

),//……

那這三個資料表怎麼建立呢?很簡單,去看framework/web/auth/schema.sql。注意要和你的自定義的表名稱對應起來。比如sql檔案中的authitem你要修改為pre_auth_item。然後在資料庫中執行這個sql檔案中的語句。

了解概念

你可能要問,剩下的**呢?我告訴你,沒有啦。rbac系統就這樣建立起來了。但是為了使用它,你需要了解它的執行機制。我會盡量講的囉嗦一點……(官方的rbac文件在這裡,但是我曾經看了4-5遍才明白。)

三個概念

你需要了解的是,授權專案可分為operations(行動),tasks(任務)和 roles(角色)。

乙個使用者擁有乙個或者多個角色,比如,我們這裡有三個角色:銀行行長、銀行職員、顧客。我們假設:

* 張行長 有角色:銀行行長、銀行職員、顧客(人家自己可以存錢嘛)。

* 王職員 有角色:銀行職員、顧客。

* 小李 有角色:顧客。

那麼,相應的,只要顧客可以做的事情,小李就可以做,王職員和張行長也可以。銀行職員可以做的事情,王職員和張行長都可以做,小李就不可以了。

比如,乙個「顧客」可以存錢,那麼擁有「顧客」角色的張行長、王職員、小李都可以存錢。「銀行職員」可以列印顧客的交易記錄,那麼有「銀行職員」角色的張行長和王職員都可以,而小李不行,必須找乙個有「銀行職員」角色的人才可以列印詳細的交易記錄。乙個「銀行行長」才可以進入銀行錢庫提錢,那麼只有張行長可以,因為它才有「銀行行長」的角色。

這就是基於角色的認證體系,簡稱rbac。

角色的繼承

角色是可以繼承的,比如我們規定如下:

* 凡是「銀行行長」都是「銀行職員」,也就是說,只要銀行職員可以做的事情,銀行行長都可以做。

* 凡是「銀行職員」都是顧客,同上,顧客可以做的事情銀行職員也可以做。

那麼角色關係就變成了:

* 張行長 有角色:銀行行長。

* 王職員 有角色:銀行職員。

* 小李 有角色:顧客。

這樣更簡單了,這就是角色的繼承。

任務的繼承

乙個任務(task)是可以包含另外乙個任務的,我們舉個例子,比如「進入銀行」。

我們設定「顧客」這個角色有「進入銀行」的許可權。也就是說,「顧客」可以執行「進入銀行」的任務。接下來,我們假設「進入櫃檯」是進入銀行的父許可權,也就是說,「進入櫃檯」包含「進入銀行」。只要能「進入櫃檯」的人都可以「進入銀行」。我們把「進入櫃檯」這個任務許可權給「銀行職員」。

那麼從角色上來說,王職員可以進入銀行,因為王職員的角色是「銀行職員」,而「銀行職員」包含了「顧客」的角色。那麼「顧客」可以進行的「任務」對於「銀行職員」來說也是可以進行的。而「顧客」可以「進入銀行」,那麼王職員也可以「進入銀行」。這是角色的繼承帶來的。

我們再假設有個趙領導,是上級領導,可以進入櫃檯進行視察。那麼,我們的任務關係是:

* 趙領導 有任務:進入櫃檯。

那麼,趙領導就可以「進入銀行」。因為「進入銀行」是被「進入櫃檯」包含的任務。只要可以執行「進入櫃檯」的人都可以執行「進入銀行」。這就是任務的繼承。

關於行動

行動是不可劃分的一級。也就是說。而乙個行動是不能包含其他行動的。假設我們有個行動叫「從銀行倉庫中提錢」。我們把這個行動作包含「進入櫃檯」。那麼只要可以執行「從銀行倉庫中提錢」的角色都可以執行「進入櫃檯」這個任務。

三者關係

* 乙個角色可以包含另外乙個或者幾個角色。

* 乙個角色可以包含另外乙個或者幾個任務。

* 乙個角色可以包含另外乙個或者幾個行動。

** 乙個任務可以包含另外乙個或者幾個任務。

* 乙個任務可以包含另外乙個或者幾個行動。

** 乙個行動只能被角色或者任務包含,行動是不可以包含其他,也不可再分。

這樣,就形成了乙個許可權管理體系。關於「任務」和「行動」,你不必思考其字面上的意義。這兩者就是形成兩層許可權。

進行賦權

我們建立了rbac許可權管理,就需要進行對許可權的web管理。這些就需要你自己寫**了。

根據不同種類的專案呼叫下列方法之一定義授權專案:

* cauthmanager::createrole

* cauthmanager::createtask

* cauthmanager::createoperation

一旦我們擁有一套授權專案,我們可以呼叫以下方法建立授權專案關係:

* cauthmanager::additemchild

* cauthmanager::removeitemchild

* cauthitem::addchild

* cauthitem::removechild

最後,我們呼叫下列方法來分配角色專案給各個使用者:

* cauthmanager::assign

* cauthmanager::revoke

下面我們將展示乙個例子是關於用所提供的api建立乙個授權等級:

$auth->createoperation('createpost','create a post');

$auth->createoperation('readpost','read a post');

$auth->createoperation('updatepost','update a post');

$auth->createoperation('deletepost','delete a post');

$task=$auth->createtask('updateownpost','update a post by author himself',$bizrule);

$task->addchild('updatepost');

$role=$auth->createrole('reader');

$role->addchild('readpost');

$role=$auth->createrole('author');

$role->addchild('reader');

$role->addchild('createpost');

$role->addchild('updateownpost');

$role=$auth->createrole('editor');

$role->addchild('reader');

$role->addchild('updatepost');

$role=$auth->createrole('admin');

$role->addchild('editor');

$role->addchild('author');

$role->addchild('deletepost');

$auth->assign('reader','readera');

$auth->assign('author','authorb');

$auth->assign('editor','editorc');

$auth->assign('admin','admind');

也就是說,你需要自己寫乙個管理介面,來列出你的角色、任務、行動,然後可以在這個介面上進行管理。比如增加、刪除、修改。

許可權檢查

假設你在你的管理介面進行了賦權,那麼可以在程式裡面進行許可權檢查:

else 

上面的**就檢查了使用者是否可以執行「createpost」,這createpost可能是乙個任務,也可以是乙個行動。

其他的對於很多說yii許可權體系rbac不好用的人其實都沒有看懂文件。綜合我的體驗,我感覺yii框架的rbac是我用過的框架裡面最好用的。而且是需要自己寫**最少的。

yii的rbac有更加高階的用法,比如「業務規則」,「預設角色」。你可以去參考官方文件。

Yii中使用RBAC完全指南

另一篇作為參考 yii提供了強大的配置機制和很多現成的類庫。在yii中使用rbac是很簡單的,完全不需要再寫rbac 所以準備工作就是,開啟編輯器,跟我來。在配置陣列中,增加以下內容 components array authmanager array class cdbauthmanager 認證...

Yii中使用RBAC完全指南

部落格分類 前端技術 寫得不錯,因為yii的文件還缺少一些實際的例子,所以不是那麼容易看懂,看了這篇就完全搞清楚了!九月 10,2009 posted by 東至 寫在前面 以下內容適合yii 1.0.x,其他版本可能有略微的差別。開始準備 yii提供了強大的配置機制和很多現成的類庫。在yii中使用...

yii 使用DB實現rbac 許可權控制

rbac 中文名稱 基於角色的許可權控制 先說後台 首先是建立許可權和角色 然後是使用我們 的使用者表 給角色分配許可權 給使用者分配角色 前台 首先 根據我們的使用者id 查詢出這個人都有什麼角色 接下來 跟據我們的角色id 查出這些角色所擁有的許可權。把這些許可權寫到乙個陣列裡 然後,獲取當前操...