溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php aco的含義是什么

發(fā)布時間:2023-03-13 13:55:43 來源:億速云 閱讀:81 作者:iii 欄目:編程語言

這篇文章主要介紹“php aco的含義是什么”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“php aco的含義是什么”文章能幫助大家解決問題。

在php中,ACO是指“訪問控制對象”,每個具體的ACO也有一個標(biāo)識,就按照M/C/A的格式進(jìn)行標(biāo)識;根據(jù)具體的業(yè)務(wù)要求,ACO可以定義到某個具體的Action級別,或者Controller級別或者整個module級別。

在php中,ACO是指“訪問控制對象”。

ACL – 權(quán)限控制

權(quán)限控制

權(quán)限控制顧名思義就是控制什么“人”能(不能)訪問什么(“操作”)。在身份認(rèn)證中,我們已經(jīng)知道了人是誰,現(xiàn)在這里就介紹yangzie如何控制這些人能做什么,yangzie是基于ACL來實(shí)現(xiàn)授權(quán)功能的,那么這里需要先闡明幾個概念:

php aco的含義是什么

Access Control Object

ACO訪問控制對象,也就是ARO要請求訪問的對象,在yangzie中也就是M/C/A,每個具體的ACO也有一個標(biāo)識,就按照M/C/A的格式進(jìn)行標(biāo)識,比如order模塊下面的增加訂單add,假如他都組織在index控制器下(index_controller),action為add;那么該ACO的標(biāo)識就是:/order/index/add;

根據(jù)具體的業(yè)務(wù)要求,ACO可以定義到某個具體的Action級別,或者Controller級別或者整個module級別

Access Request Object

ARO訪問請求對象,也就是要請求ACO的對象,通常他指“人”,各種各樣的類型的人,每種“類型”有一個唯一的標(biāo)識,用于區(qū)別一類人,比如某種角色的,也可以唯一標(biāo)識一個人;

這個標(biāo)識yangzie的設(shè)計是從大類/小類/具體某個用戶id然后以/進(jìn)行分割,舉個例子,假如系統(tǒng)中存在這這幾種角色,超級管理員,普通管理員,銷售;可能這幾種角色的ARO標(biāo)識看起來是這個樣子:

  • 超級管理員:/admin/root

  • 普通管理員:/admin/normal

  • 銷售:/salesman

  • 管理員A:/admin/normal/12344

為什么要這樣設(shè)計,是因?yàn)樵谶M(jìn)行授權(quán)時可以把權(quán)限分配給組或者具體某個類型或者具體某個人;然后具體的某個用戶,如上面的管理員A,在驗(yàn)證權(quán)限時,再從具體id到大類來逐一驗(yàn)證,直到找到具體的權(quán)限是允許還是拒絕為止。

ACL

ARO和ACO分別定義了“操作”和“人”,那么剩下的就是把這兩個關(guān)聯(lián)起來,從而達(dá)到什么人能訪問什么的目的;這個關(guān)聯(lián)的地方就是AccessControlList;

例如yangzie中它是一個配置文件,位于app/__aros_acos__.php;默認(rèn)的內(nèi)容如下:

function yze_get_aco_desc($aconame) {
    foreach ( ( array ) yze_get_acos_aros () as $aco => $desc ) {
        if (preg_match ( "{^" . $aco . "}", $aconame )) {
            return @$desc ['desc'];
        }
    }
    return '';
}
function yze_get_ignore_acos() {
    return array();
}
function yze_get_acos_aros() {
    $array = array (
            "/" => array (//module/controller/action
                    "deny" => "",
                    "allow" => array (
                            "*" //aro
                    ),
                    "desc" => ""//功能說明 
            )
		);
    
	return $array;
}

該文件主要包含3個函數(shù):

  • yze_get_acos_aros:該方法返回ACL列表

  • yze_get_ignore_acos:該方法返回忽略權(quán)限控制的ACO,當(dāng)ARO請求這些內(nèi)容時忽略權(quán)限控制

  • yze_get_aco_desc: 助手方法,返回ACO功能的描述,

ACL的格式

ACL是一個數(shù)組,格式如下:

array (
            "ACO1 name" => array (
                    "deny" => "",//拒絕的ARO
                    "allow" => array (
                            "*" //允許的ARO
                    ),
                    "desc" => ""//ACO功能說明 
            ),
            "ACO2 name" => array (
                    "deny" => "",//拒絕的ARO
                    "allow" => "*", //允許的ARO,
                    "desc" => ""//ACO功能說明 
            ),
);

ACO name是ACO的標(biāo)識,根據(jù)權(quán)限控制的級別可以具體定義到Action級別,或者只定義到Module級別;

deny定義黑名單,拒絕里面列出的ARO的訪問;allow定義白名單,允許里面列出的ARO

ACL定義規(guī)則:

  • ACO和ARO都可以使用正則表達(dá)

  • 黑名單優(yōu)先級大于白名單

  • 兩者都可以采用”*”來代表所有

  • 如果要指定具體的aro,deny和allow中以數(shù)組的形式列出ARO

一個真實(shí)的例子:

function yze_get_ignore_acos() {
    return array(
            "/card/front",
            "/package/package/grab",
            "/package/package/grabfail",
            "/package/front",
            "/zb/middlepage/view",
            "/wxbbs/front",
            "/zbad/front",
    );
}
function yze_get_acos_aros() {
    $array = array (
            "/admin" => array (
                    "deny" => "*",
                    "allow" => array (
                            "/admin" 
                    ),
                    "desc" => "后端管理" 
            ),
            "/sp/consumers" => array (
                    "deny" => "*",
                    "allow" => array (
                            "/sp"
                    ),
                    "desc" => "粉絲管理"
            )
    );
    if (YDWXP_TYPE == YDWXP_TYPE_MARKET || YDWXP_TYPE == YDWXP_TYPE_ALL) {
        $array ['/card'] = array (
                "deny" => "*",
                "allow" => array ("/sp"),
                "desc" => "卡券管理" 
        );
        $array ['/card/card/*consume'] = array (
                "deny" => "*",
                "allow" => array ("/sp"),
                "desc" => "卡券核銷"
        );
        $array ['/card/merchants'] = array (
                "deny" => "*",
                "allow" => array ("/sp/super","/sp/common"),
                "desc" => "商戶管理" 
        );
    }
    
	return $array;
}

ARO怎么定義

ACO是根據(jù)M/C/A來定義的,這很明確和具體,但ARO標(biāo)識怎么根據(jù)用戶來定義?這也是通過hook來實(shí)現(xiàn)的,在app/hooks/auth.php中已經(jīng)定義注冊了該hook,開發(fā)者只需要實(shí)現(xiàn)即可,這里有一個真實(shí)的例子:

YZE_Hook::add_hook ( YZE_FILTER_GET_USER_ARO_NAME, function  ( $data ) {
	if ( !@$_SESSION [ 'admin' ] )return "/";
	if(is_a($_SESSION['admin'], "\\app\\sp\\Consumer_Model")){
	   return "/consumer";
	}
    if($_SESSION [ 'admin' ]->sp_id) {
       //是否子商戶
       if ( ! isset($_SESSION [ 'is_sub_merchant' ]) ) {
           $_SESSION [ 'is_sub_merchant' ] = YZE_Hook::do_hook(YDMARKET_IS_SUB_MERCHANT, $_SESSION [ 'admin' ]->sp_id);
       }
       if ($_SESSION [ 'is_sub_merchant' ]) {
           return "/".$_SESSION [ 'admin' ]->user->type."/sub/".$_SESSION [ 'admin' ]->type;
       }
    }
	return "/".$_SESSION [ 'admin' ]->user->type."/".$_SESSION [ 'admin' ]->type;
} );

根據(jù)自己的業(yè)務(wù)系統(tǒng)的用戶類型,自行設(shè)計自己的ARO標(biāo)識接口。

能靈活的配置權(quán)限嗎?

ACL列表屬于事先硬編碼的控制列表,但在實(shí)際的業(yè)務(wù)環(huán)節(jié)中很多權(quán)限都是需要動態(tài)分配的,比如給某中角色設(shè)置權(quán)限,給具體某個人設(shè)置權(quán)限;這在yangzie中如何做呢?

yangzie有兩個預(yù)留函數(shù)get_permissions($aroname),get_user_permissions();

這兩個函數(shù)由開發(fā)者實(shí)現(xiàn),分別返回指定aroname的acl或者返回某個具體用戶的acl,這通常是具體的業(yè)務(wù)要求決定的,返回的仍然是acl數(shù)組結(jié)構(gòu)。這兩個函數(shù)放在任意的自動包含文件中(見__config__.php說明),但要注意

這兩個函數(shù)必須屬于頂級命名空間

當(dāng)有這兩個函數(shù)的實(shí)現(xiàn)時,他們的返回結(jié)果將覆蓋ACL里面的控制

ACL的效果是什么

當(dāng)配置好ACL后,如果一個用戶訪問被deny的內(nèi)容,如某個action,某個controller或者某個module;yangzie將會拋出YZE_Permission_Deny_Exception異常,開發(fā)者可以通過hook YZE_FILTER_YZE_EXCEPTION來監(jiān)聽然后做響應(yīng)的處理,默認(rèn)情況下將顯示500頁面;

這就是說yangzie會根據(jù)ACL來驗(yàn)證用戶的權(quán)限,如果用戶沒有權(quán)限就會立即拋出異常,這在進(jìn)入開發(fā)者的業(yè)務(wù)邏輯之前就已經(jīng)處理,開發(fā)者無需在自己的功能代碼中去驗(yàn)證當(dāng)前用戶是誰,是否有權(quán)限方法;開發(fā)者就只關(guān)注自己的業(yè)務(wù)邏輯即可。

GET和POST的特殊情況

yangzie的Action包含兩種情況,get方式和post方法,比如一個增加用戶的例子,假如M/C/A是:users/index/add;那么他對應(yīng)的post action就是users/index/post_add,會多一個post前綴,如果在ACL需要針對這兩種情況單獨(dú)控制,比如允許get但不允許post,也就是允許看,但不允許提交,那在ACL中需要分配針對兩個action(add,post_add)進(jìn)行處理

如何通過ACL來控制輸出

在實(shí)際的業(yè)務(wù)系統(tǒng)中,通常需要根據(jù)權(quán)限來控制輸出的響應(yīng)中某些部分用戶可見,某些部分用戶不可見,那么這可以通過兩種方式來實(shí)現(xiàn)。

方法一:通過YZE_ACL::get_instance()->check_byname($aroname, $aconame)來判斷并輸出

if(YZE_ACL::get_instance()->check_byname($aroname, $aconame)){
// your output html
}

方法二:通過YZE_ACL::get_instance()->begin_check_permission($id, $aroname, $aconame)….YZE_ACL::get_instance()->end_check_permission($id, $aroname, $aconame)來輸出

YZE_ACL::get_instance()->begin_check_permission($id, $aroname, $aconame)
// your output html
YZE_ACL::get_instance()->end_check_permission($id, $aroname, $aconame)

根據(jù)你的習(xí)慣來選擇,如果你不喜歡跨度很大的if(){},那用第二種方式是個好選擇。

關(guān)于“php aco的含義是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI