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