大批 :
$arrayStr = ["user_id" => 2,
"user_name" => "Denny Septian Panggabean",
"user_company" => "KMK Global Sports",
"user_relation" => "Broker",
"user_roles" => "Super Admin",
"user_rules" => [
[
"menu_no" => "1",
"menu_parent" => "0",
"menu_name" => "Dashboard",
"menu_link" => "dashboard",
"menu_icon" => "fas fa-tachometer-alt",
"menu_class" => "",
"menu_access" => "F",
"menu_order" => "1",
"menu_locked" => "0"
],
[
"menu_no" => "2",
"menu_parent" => "0",
"menu_name" => "Settings",
"menu_link" => "javascript:void(0)",
"menu_icon" => "fas fa-cogs",
"menu_class" => "",
"menu_access" => "F",
"menu_order" => "2",
"menu_locked" => "0",
"menu_child" => [
[
"menu_no" => "5",
"menu_parent" => "2",
"menu_name" => "Diagnosa",
"menu_link" => "dashboard/diagnosa",
"menu_icon" => "fas fa-angle-double-right",
"menu_class" => "",
"menu_access" => "F",
"menu_order" => "1",
"menu_locked" => "0"
],
[
"menu_no" => "6",
"menu_parent" => "2",
"menu_name" => "Provider",
"menu_link" => "dashboard/provider",
"menu_icon" => "fas fa-angle-double-right",
"menu_class" => "",
"menu_access" => "F",
"menu_order" => "2",
"menu_locked" => "0"
],
[
"menu_no" => "7",
"menu_parent" => "2",
"menu_name" => "Relation",
"menu_link" => "dashboard/relation",
"menu_icon" => "fas fa-angle-double-right",
"menu_class" => "",
"menu_access" => "F",
"menu_order" => "3",
"menu_locked" => "0"
],
[
"menu_no" => "8",
"menu_parent" => "2",
"menu_name" => "Plan",
"menu_link" => "dashboard/plan",
"menu_icon" => "fas fa-angle-double-right",
"menu_class" => "",
"menu_access" => "F",
"menu_order" => "4",
"menu_locked" => "0"
],
[
"menu_no" => "4",
"menu_parent" => "2",
"menu_name" => "Benefit Group",
"menu_link" => "dashboard/benefit-group",
"menu_icon" => "fas fa-angle-double-right",
"menu_class" => "",
"menu_access" => "F",
"menu_order" => "5",
"menu_locked" => "0"
],
[
"menu_no" => "3",
"menu_parent" => "2",
"menu_name" => "Benefit",
"menu_link" => "dashboard/benefit",
"menu_icon" => "fas fa-angle-double-right",
"menu_class" => "",
"menu_access" => "F",
"menu_order" => "6",
"menu_locked" => "0"
],
[
"menu_no" => "9",
"menu_parent" => "2",
"menu_name" => "Menu",
"menu_link" => "dashboard/menu",
"menu_icon" => "fas fa-angle-double-right",
"menu_class" => "",
"menu_access" => "R",
"menu_order" => "7",
"menu_locked" => "0"
],
[
"menu_no" => "10",
"menu_parent" => "2",
"menu_name" => "User",
"menu_link" => "dashboard/user",
"menu_icon" => "fas fa-angle-double-right",
"menu_class" => "",
"menu_access" => "F",
"menu_order" => "8",
"menu_locked" => "0"
],
[
"menu_no" => "11",
"menu_parent" => "2",
"menu_name" => "Policy",
"menu_link" => "dashboard/policy",
"menu_icon" => "fas fa-angle-double-right",
"menu_class" => "",
"menu_access" => "F",
"menu_order" => "9",
"menu_locked" => "0"
],
],
],
],
];
功能 :
public function arrRecursiveAccessMap(string $needle = '', string $needleOther = '', array $haystack = [])
{
$dataParams = array(
'create' => array('F','W'),
'update' => array('F','W'),
'delete' => array('F'),
);
$paramKeys = array_keys($dataParams);
if (is_numeric($needleOther) || in_array($needleOther, $paramKeys, true)) {
foreach($haystack as $first_level_key=>$value) {
if ($needle === $value) {
return array($first_level_key);
} elseif (is_array($value)) {
$callback = $this->arrRecursiveAccessMap($needle, $needleOther, $value);
if ($callback) {
return array_merge(array($first_level_key), $callback);
}
}
}
return false;
}
return false;
}
概念:
任何用戶都可以訪問選單,如果每個用戶都輸入了不可訪問的 uri 引數,請拒絕它。
例子 :
用戶John Doe有串列選單
- 產品(完全訪問)
- 報告(完全訪問)
- 選單(只讀)
并且 John Doe 打開https://localhost/dashboard/menu/create了,被系統拒絕了。
期待 :
我想搜索值儀表板/選單以獲取 'menu_access' 值為R。并驗證如果陣列$dataParams['create'] alias ['F','W']中的值R怎么辦?
例子 :
利用 :arrRecursiveAccessMap('dashboard/menu', 'create', $arrayStr);
預期結果:假
uj5u.com熱心網友回復:
$dataParams = array( 'create' => array('F','W'), 'update' => array('F','W'), 'delete' => array('F'), ); $paramKeys = array_keys($dataParams);
您在每個不需要的遞回呼叫中重復上述代碼片段。您可以將其作為函式的引數。
你也做了
return array_merge(array($first_level_key), $callback);,但你說Expect Result : false。因此,array_merge也不需要 an 。你也有這個 check
if (is_numeric($needleOther) || in_array($needleOther, $paramKeys, true)) {,這也是不需要的。
解決方案:
您可以簡單地創建一個函式,將$dataParams和create鍵作為引數傳遞。如果找到inside的值,則繼續遞回呼叫相同的函式menu_child并回傳,否則回傳。truemenu_access$dataParams['create']false
片段:
<?php
function userHasAccess($menu_rules, $dataParams, $data_param_key, $value_to_search){
foreach($menu_rules as $menu_rule){
if(($menu_rule['menu_link'] === $value_to_search && in_array($menu_rule['menu_access'], $dataParams[$data_param_key]))
|| userHasAccess($menu_rule['menu_child'] ?? [], $dataParams, $data_param_key, $value_to_search)){
return true;
}
}
return false;
}
var_dump(userHasAccess($arrayStr['user_rules'], $dataParams, 'create', 'dashboard/menu'));
在線演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496378.html
