バックグラウンド管理システムまたは許可管理モジュールを開発する場合、許可制御は通常不可欠な部分です。典型的なシナリオは、システムに完全な一連の権限があり、各ユーザーにはアクセス許可の一部のみが付与されることです。インターフェイスを提示したり、機能を実行する前にユーザーが持っていないアクセス許可を効果的にフィルタリングするには、許可フィルタリングのための正確で効率的な方法が必要です。 PHPによって提供されるarray_diff_ukey()関数は、いくつかのシナリオでこの許可フィルタリングを実装できます。
この記事では、実用的な例を使用して、 array_diff_ukey()を使用してユーザー許可フィルタリングを効率的に実装する方法を示します。
システムが許可の完全なセットを定義しているとします。
$allPermissions = [
'user.view' => 'ユーザーを表示します',
'user.edit' => 'ユーザーを編集します',
'post.view' => '記事をご覧ください',
'post.edit' => '記事を編集します',
'admin.panel' => '背景にアクセスしてください',
];
通常のユーザーの許可は次のとおりです。
$userPermissions = [
'user.view' => true,
'post.view' => true,
];
ロギング、セキュリティチェック、許可プロンプトなどの機能に対してユーザーが所有していない権限のリストを取得したいと考えています。
array_diff_ukey()関数の関数は、2つの配列のキー名を比較し、カスタム比較にコールバック関数を使用し、他の配列ではなく最初の配列に存在するキー値ペアを返します。
ユーザーが$ allpermissionsで所有していない権限を取得するために使用できます。
$diff = array_diff_ukey(
$allPermissions,
$userPermissions,
function($key1, $key2) {
return strcmp($key1, $key2);
}
);
上記のコードでは、 $ diffは、すべてのユーザーが所有していない権限を含む配列を返します。
[
'user.edit' => 'ユーザーを編集します',
'post.edit' => '記事を編集します',
'admin.panel' => '背景にアクセスしてください',
]
管理者が特定のユーザーの項目が欠落していることを調整するために、管理者に表示する許可構成ページがあると想像してください。これを行うことができます:
function getMissingPermissions(array $allPermissions, array $userPermissions): array {
return array_diff_ukey(
$allPermissions,
$userPermissions,
fn($a, $b) => strcmp($a, $b)
);
}
// すべての権限
$allPermissions = [
'user.view' => 'ユーザーを表示します',
'user.edit' => 'ユーザーを編集します',
'post.view' => '記事をご覧ください',
'post.edit' => '記事を編集します',
'admin.panel' => '背景にアクセスしてください',
];
// ユーザーが所有する権限
$userPermissions = [
'user.view' => true,
'post.view' => true,
];
// 不足している権限を取得します
$missing = getMissingPermissions($allPermissions, $userPermissions);
// 出力結果
foreach ($missing as $code => $desc) {
echo "許可がありません: $desc ($code)" . PHP_EOL;
}
出力の結果は次のとおりです。
許可がありません: ユーザーを編集します (user.edit)
許可がありません: 記事を編集します (post.edit)
許可がありません: 背景にアクセスしてください (admin.panel)
許可監査システム:ユーザーの許可構成を確認するときに、不足しているアイテムをすばやく見つけます。
違いロギング:ユーザーの許可が変更される前後の違いを記録します。
フロントエンドの許可ツリーフィルタリング:フロントエンド処理のためにユーザーが許可されていない関数アイテムを動的に構築します。
URL許可確認:アクセス制御をルーティング許可の識別と統合します。例えば:
$permissions = [
'/dashboard' => 'ダッシュボードにアクセスします',
'/admin/users' => 'ユーザーを管理します',
'/admin/settings' => 'システム設定',
];
$userPermissions = [
'/dashboard' => true,
];
$unauthorized = array_diff_ukey($permissions, $userPermissions, 'strcmp');
foreach ($unauthorized as $url => $desc) {
echo "ユーザーにはアクセス許可がありません: https://m66.net$url ($desc)" . PHP_EOL;
}
出力: