現在の位置: ホーム> 最新記事一覧> Array_diff_ukey()の使用方法許可フィルタリング機能を実装するとき

Array_diff_ukey()の使用方法許可フィルタリング機能を実装するとき

M66 2025-06-06

バックグラウンド管理システムまたは許可管理モジュールを開発する場合、許可制御は通常不可欠な部分です。典型的なシナリオは、システムに完全な一連の権限があり、各ユーザーにはアクセス許可の一部のみが付与されることです。インターフェイスを提示したり、機能を実行する前にユーザーが持っていないアクセス許可を効果的にフィルタリングするには、許可フィルタリングのための正確で効率的な方法が必要です。 PHPによって提供されるarray_diff_ukey()関数は、いくつかのシナリオでこの許可フィルタリングを実装できます。

この記事では、実用的な例を使用して、 array_diff_ukey()を使用してユーザー許可フィルタリングを効率的に実装する方法を示します。

1。シーンの説明

システムが許可の完全なセットを定義しているとします。

 $allPermissions = [
    'user.view' => 'ユーザーを表示します',
    'user.edit' => 'ユーザーを編集します',
    'post.view' => '記事をご覧ください',
    'post.edit' => '記事を編集します',
    'admin.panel' => '背景にアクセスしてください',
];

通常のユーザーの許可は次のとおりです。

 $userPermissions = [
    'user.view' => true,
    'post.view' => true,
];

ロギング、セキュリティチェック、許可プロンプトなどの機能に対してユーザーが所有していない権限のリストを取得したいと考えています。

2。array_diff_ukey ()を使用してフィルタリングします

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' => '背景にアクセスしてください',
]

3.ビジネスロジックを組み合わせた完全な例

管理者が特定のユーザーの項目が欠落していることを調整するために、管理者に表示する許可構成ページがあると想像してください。これを行うことができます:

 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)

4.典型的なアプリケーションシナリオ

  • 許可監査システム:ユーザーの許可構成を確認するときに、不足しているアイテムをすばやく見つけます。

  • 違いロギング:ユーザーの許可が変更される前後の違いを記録します。

  • フロントエンドの許可ツリーフィルタリング:フロントエンド処理のためにユーザーが許可されていない関数アイテムを動的に構築します。

  • 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;
}

出力: