Auth 權(quán)限擴(kuò)展 (由@黃苗筍提供)

2018-11-21 21:32 更新

Auth 權(quán)限擴(kuò)展使用文檔

前言

首先要說明一個(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)步。

了解Auth權(quán)限認(rèn)證

想要詳細(xì)了解Auth權(quán)限認(rèn)證的思路,請(qǐng)移步 比RBAC更好的權(quán)限認(rèn)證方式(Auth類認(rèn)證)
在此我就不過多地對(duì)Auht本身進(jìn)行說明了。

安裝

(1)、擴(kuò)展包下載:

 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

(2)、數(shù)據(jù)庫表導(dǎo)入:

要使用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主鍵即可。

(3)、項(xiàng)目配置:

將 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è)的用戶
    )
);

(4)、入口注冊(cè):

//必須顯式注冊(cè),以便可以讓服務(wù)自行初始化
DI()->authLite = new Auth_Lite();

入門使用

經(jīng)過前面的一番配置,馬上就可以實(shí)現(xiàn)權(quán)限認(rèn)證功能了。

(1)、用戶登錄

Auth是基于用戶和組的認(rèn)證方式,所以在認(rèn)證之前,首先要實(shí)現(xiàn)用戶登錄,登錄成功后,接口訪問地址必須帶上UserID參數(shù),
至于登錄過程由各位同學(xué)自行實(shí)現(xiàn),此處不做描述。

(2)、權(quán)限檢測(cè)

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)鍵。

(3)、數(shù)據(jù)庫操作:

(3.1)創(chuàng)建組:

INSERT INTO `phalapi`.`phalapi_auth_group` (`id`, `title`, `status`, `rules`)
 VALUES (NULL, '超級(jí)管理員', '1', '');

輸入圖片說明

(3.2)用戶與組關(guān)聯(lián):

INSERT INTO `phalapi`.`phalapi_auth_group_access` (`uid`, `group_id`) VALUES ('1', '1');

輸入圖片說明

注意: 一個(gè)用戶可以關(guān)聯(lián)多個(gè)組

(3.3)創(chuàng)建規(guī)則:

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ù)。

(3.4)組關(guān)聯(lián)規(guī)則:

UPDATE `phalapi`.`phalapi_auth_group` SET `rules` = '1' WHERE `phalapi_auth_group`.`id` = 1;

輸入圖片說明
更新組表的rules字段,將規(guī)則id加入該字段。

(3.5)完成

經(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)這些功能。

其他說明

(1)、免檢用戶

如果您需要保留一個(gè)或多個(gè)用戶可以不經(jīng)過權(quán)限檢測(cè),可以訪問所有接口,您可以在配置中加入免檢用戶ID:

'auth_not_check_user' => array(1,2) //跳過權(quán)限檢測(cè)的用戶

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)