您好,登錄后才能下訂單哦!
這篇文章主要介紹“php aco的含義是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“php aco的含義是什么”文章能幫助大家解決問題。
在php中,ACO是指“訪問控制對象”,每個具體的ACO也有一個標識,就按照M/C/A的格式進行標識;根據具體的業務要求,ACO可以定義到某個具體的Action級別,或者Controller級別或者整個module級別。
在php中,ACO是指“訪問控制對象”。
權限控制
權限控制顧名思義就是控制什么“人”能(不能)訪問什么(“操作”)。在身份認證中,我們已經知道了人是誰,現在這里就介紹yangzie如何控制這些人能做什么,yangzie是基于ACL來實現授權功能的,那么這里需要先闡明幾個概念:
Access Control Object
ACO訪問控制對象,也就是ARO要請求訪問的對象,在yangzie中也就是M/C/A,每個具體的ACO也有一個標識,就按照M/C/A的格式進行標識,比如order模塊下面的增加訂單add,假如他都組織在index控制器下(index_controller),action為add;那么該ACO的標識就是:/order/index/add;
根據具體的業務要求,ACO可以定義到某個具體的Action級別,或者Controller級別或者整個module級別
Access Request Object
ARO訪問請求對象,也就是要請求ACO的對象,通常他指“人”,各種各樣的類型的人,每種“類型”有一個唯一的標識,用于區別一類人,比如某種角色的,也可以唯一標識一個人;
這個標識yangzie的設計是從大類/小類/具體某個用戶id然后以/進行分割,舉個例子,假如系統中存在這這幾種角色,超級管理員,普通管理員,銷售;可能這幾種角色的ARO標識看起來是這個樣子:
超級管理員:/admin/root
普通管理員:/admin/normal
銷售:/salesman
管理員A:/admin/normal/12344
為什么要這樣設計,是因為在進行授權時可以把權限分配給組或者具體某個類型或者具體某個人;然后具體的某個用戶,如上面的管理員A,在驗證權限時,再從具體id到大類來逐一驗證,直到找到具體的權限是允許還是拒絕為止。
ACL
ARO和ACO分別定義了“操作”和“人”,那么剩下的就是把這兩個關聯起來,從而達到什么人能訪問什么的目的;這個關聯的地方就是AccessControlList;
例如yangzie中它是一個配置文件,位于app/__aros_acos__.php;默認的內容如下:
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個函數:
yze_get_acos_aros:該方法返回ACL列表
yze_get_ignore_acos:該方法返回忽略權限控制的ACO,當ARO請求這些內容時忽略權限控制
yze_get_aco_desc: 助手方法,返回ACO功能的描述,
ACL的格式
ACL是一個數組,格式如下:
array (
"ACO1 name" => array (
"deny" => "",//拒絕的ARO
"allow" => array (
"*" //允許的ARO
),
"desc" => ""//ACO功能說明
),
"ACO2 name" => array (
"deny" => "",//拒絕的ARO
"allow" => "*", //允許的ARO,
"desc" => ""//ACO功能說明
),
);
ACO name是ACO的標識,根據權限控制的級別可以具體定義到Action級別,或者只定義到Module級別;
deny定義黑名單,拒絕里面列出的ARO的訪問;allow定義白名單,允許里面列出的ARO
ACL定義規則:
ACO和ARO都可以使用正則表達
黑名單優先級大于白名單
兩者都可以采用”*”來代表所有
如果要指定具體的aro,deny和allow中以數組的形式列出ARO
一個真實的例子:
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是根據M/C/A來定義的,這很明確和具體,但ARO標識怎么根據用戶來定義?這也是通過hook來實現的,在app/hooks/auth.php中已經定義注冊了該hook,開發者只需要實現即可,這里有一個真實的例子:
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;
} );
根據自己的業務系統的用戶類型,自行設計自己的ARO標識接口。
能靈活的配置權限嗎?
ACL列表屬于事先硬編碼的控制列表,但在實際的業務環節中很多權限都是需要動態分配的,比如給某中角色設置權限,給具體某個人設置權限;這在yangzie中如何做呢?
yangzie有兩個預留函數get_permissions($aroname),get_user_permissions();
這兩個函數由開發者實現,分別返回指定aroname的acl或者返回某個具體用戶的acl,這通常是具體的業務要求決定的,返回的仍然是acl數組結構。這兩個函數放在任意的自動包含文件中(見__config__.php說明),但要注意
這兩個函數必須屬于頂級命名空間
當有這兩個函數的實現時,他們的返回結果將覆蓋ACL里面的控制
ACL的效果是什么
當配置好ACL后,如果一個用戶訪問被deny的內容,如某個action,某個controller或者某個module;yangzie將會拋出YZE_Permission_Deny_Exception異常,開發者可以通過hook YZE_FILTER_YZE_EXCEPTION來監聽然后做響應的處理,默認情況下將顯示500頁面;
這就是說yangzie會根據ACL來驗證用戶的權限,如果用戶沒有權限就會立即拋出異常,這在進入開發者的業務邏輯之前就已經處理,開發者無需在自己的功能代碼中去驗證當前用戶是誰,是否有權限方法;開發者就只關注自己的業務邏輯即可。
GET和POST的特殊情況
yangzie的Action包含兩種情況,get方式和post方法,比如一個增加用戶的例子,假如M/C/A是:users/index/add;那么他對應的post action就是users/index/post_add,會多一個post前綴,如果在ACL需要針對這兩種情況單獨控制,比如允許get但不允許post,也就是允許看,但不允許提交,那在ACL中需要分配針對兩個action(add,post_add)進行處理
如何通過ACL來控制輸出
在實際的業務系統中,通常需要根據權限來控制輸出的響應中某些部分用戶可見,某些部分用戶不可見,那么這可以通過兩種方式來實現。
方法一:通過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)
根據你的習慣來選擇,如果你不喜歡跨度很大的if(){},那用第二種方式是個好選擇。
關于“php aco的含義是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。