W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
首先要說明一個問題,有很多同學(xué)都會對Auth和OAuth這名稱特別相似的東西傻傻分不清楚,但實際這是兩個概念,Auth擴展指的是實現(xiàn)了基于用戶與組的權(quán)限認證功能,與RBAC權(quán)限認證類似,主要用于對服務(wù)級別的功能進行權(quán)限控制,而OAuth,大概可以理解為接口簽名認證。
如果有開發(fā)網(wǎng)站后臺或者管理系統(tǒng)經(jīng)驗的同學(xué)應(yīng)該明白權(quán)限認證的重要性,所以基于這個情況,我就寫了這個擴展,當然,這個擴展是移植于TP的Auth類,并做了相關(guān)的優(yōu)化,也提供了相關(guān)操作的Api接口, 并沒有什么技術(shù)性,希望能幫助并方便到大家。
我并不是一個專業(yè)的phper,只是出自于自己對這份事情的愛好,所以在編碼的規(guī)范,代碼的使用上或許存在不少的弊端,也希望賞臉用了這個擴展類的同學(xué),多提寶貴意見。讓我不斷地進步。
想要詳細了解Auth權(quán)限認證的思路,請移步 比RBAC更好的權(quán)限認證方式(Auth類認證)。
在此我就不過多地對Auht本身進行說明了。
從 PhalApi-Library 擴展庫中下載獲取 Auth 擴展包,如使用:
git clone https://git.oschina.net/dogstar/PhalApi-Library.git
然后把 Auth 目錄復(fù)制到 ./PhalApi/Library/ 下,即:
cp ./PhalApi-Library/Auth ./PhalApi/Library/ -R
要使用Auth擴展,必須先導(dǎo)入相關(guān)的數(shù)據(jù)表,需要導(dǎo)入以下表:
$ cd /Library/User $ tree ├── Data │ ├── auth_group.sql │ ├── auth_rule.sql │ ├── auth_group_access.sql
導(dǎo)入前,可以自行調(diào)整表的前綴。
特別注意: 要實現(xiàn)Auth權(quán)限認證,數(shù)據(jù)庫中必須存在User表,用于存放用戶信息,但User表是根據(jù)項目需求自主創(chuàng)建的,只要存在ID主鍵即可。
將 PhalApi-Library/Auth/Config/app.php 里面的配置拷貝到你的項目配置:
return array( //請將以下配置拷貝到 ./Config/app.php 文件對應(yīng)的位置中 'auth' => array( 'auth_on' => true, // 認證開關(guān) 'auth_user' => 'user', // 用戶信息表, 'auth_group' => 'auth_group', // 組數(shù)據(jù)表名 'auth_group_access' => 'auth_group_access', // 用戶-組關(guān)系表 'auth_rule' => 'auth_rule', // 權(quán)限規(guī)則表 'auth_not_check_user' => array(1) //跳過權(quán)限檢測的用戶 ) );
//必須顯式注冊,以便可以讓服務(wù)自行初始化 DI()->authLite = new Auth_Lite();
經(jīng)過前面的一番配置,馬上就可以實現(xiàn)權(quán)限認證功能了。
Auth是基于用戶和組的認證方式,所以在認證之前,首先要實現(xiàn)用戶登錄,登錄成功后,接口訪問地址必須帶上UserID參數(shù),
至于登錄過程由各位同學(xué)自行實現(xiàn),此處不做描述。
Auth權(quán)限認證使用非常簡單,權(quán)限檢測操作建議放在接口自定義簽名認證的函數(shù)里面的,示例如下:
//$ vim ./Demo/Common/SignFilter.php <?php class Common_SignFilter implements PhalApi_Filter { public function check() { $user->checkLogin() //檢測登錄,自主實現(xiàn) $api=DI()->request->get('service','Default.Index'); //獲取當前訪問的接口 $userId=DI()->request->get('user_id',0);//獲取用戶id參數(shù) $r=DI()->authLite->check($api,$userId); if(!$r){ //拋出異常 } } }
給項目增加了權(quán)限檢測的代碼之后,訪問接口,通常會拋出異常:
//訪問地址 127.0.0.1/PhalApi/Public/Dome/&user_id=1;
//異常 {code:401,data:null,msg:"沒有接口訪問權(quán)限"}
此時拋出的異常是正常的,因為數(shù)據(jù)表里面并沒有定義相關(guān)的規(guī)則,也沒有創(chuàng)建相關(guān)的組和關(guān)聯(lián),所以下面的操作,才是關(guān)鍵。
INSERT INTO `phalapi`.`phalapi_auth_group` (`id`, `title`, `status`, `rules`) VALUES (NULL, '超級管理員', '1', '');
INSERT INTO `phalapi`.`phalapi_auth_group_access` (`uid`, `group_id`) VALUES ('1', '1');
注意: 一個用戶可以關(guān)聯(lián)多個組
INSERT INTO `phalapi`.`phalapi_auth_rule` (`id`, `name`, `title`, `status`, `add_condition`) VALUES (NULL, 'Default.Index', '默認接口', '1', '');
對于規(guī)則,需要做一下說明,通常做權(quán)限認證就是對訪問Url的認證,
RBAC的權(quán)限認證方式,是通過在數(shù)據(jù)庫建立節(jié)點,模塊/控制器/方法,然后在檢測的時候獲取url里面的指定參數(shù),如:M=dome&a=Default&c=Index,跟數(shù)據(jù)庫的數(shù)據(jù)做對比,如果節(jié)點存在,則通過認證,
Auth的規(guī)則實現(xiàn)更加簡單,直接在規(guī)則表的name字段加入接口地址“Default.Index”即可,name字段存儲的正是url的service參數(shù)。
UPDATE `phalapi`.`phalapi_auth_group` SET `rules` = '1' WHERE `phalapi_auth_group`.`id` = 1;
更新組表的rules字段,將規(guī)則id加入該字段。
經(jīng)過上面的數(shù)據(jù)庫操作之后,再訪問剛才的連接,就不會拋出異常了,如果訪問別的接口,還是會拋出異常,下面要做的就是往數(shù)據(jù)庫里不斷更新規(guī)則了,
當然,如果所有的操作都要想上面去操作數(shù)據(jù)庫的話,肯定是不合理的,所以Auth擴展也提供了,所有操作的Api接口:
$ cd /Library/Auth $ tree ├── Auth │ ├── Api │ │ ├──Group.php │ │ ├──Rule.php │ ├── Domain │ ├── Model
當然,您也可以自己編寫接口來實現(xiàn)這些功能。
如果您需要保留一個或多個用戶可以不經(jīng)過權(quán)限檢測,可以訪問所有接口,您可以在配置中加入免檢用戶ID:
'auth_not_check_user' => array(1,2) //跳過權(quán)限檢測的用戶
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: