首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 二進制交叉權限微型類深度解析

     編輯:PHP 相關知識

前言

在 Web 應用開發中,權限控制是核心功能之一。傳統的 ACL(存取控制列表)雖然直觀,但在多對多、交叉場景下往往顯得笨重。本文介紹一個基於位運算的微型 PHP 類 s_allow,它利用二進制位掩碼實現靈活、高效的權限分配與驗證,並展示了 PHP 閉包、array_walk/array_flip 等現代特性的實戰應用。

核心亮點

  • 多對多交叉場景分配:一個角色可屬於多個場景,一個場景可包含多個權限點,靈活應對複雜業務。
  • PHP 新特性實戰:大量使用閉包、array_walk、array_flip 等,代碼簡潔高效。
  • 位運算 & 經典案例:以 2 的 N 次方作為權限值,通過位與運算快速判斷擁有權限。

適用場景

  1. 常見的增刪改查權限控制(權限值存儲為 2 的 N 次方整數)。
  2. 用戶認證、第三方賬號綁定、多分類選擇等多狀態標記。

配置示例

權限點以鍵值對形式定義在配置文件中,鍵為位索引(從 1 開始),值為權限標識:

[access]
1=add
2=del
3=read
4=list
5=mod
6=detail
7=pub
8=collect
9=like
10=send

[cert]
1=email
2=tel
3=qq
4=identity_card
5=real_name
6=business_license

[bind]
1=qq
2=weibo
3=taobao
4=alipay
5=renren
6=weichat
7=baidu

核心類實現

<?php
class s_allow {
    // 聲明使用場景、任務清單
    public $scene, $case_list = array();
    // 聲明指定用戶角色、允許值、允許清單
    public $allow_value = 0, $allow_list = array();

    // 初始化場景、角色
    function __construct($scene, $allow_value = 0) {
        $this->scene = $scene;
        $this->case_list = $this->case_list(true);
        if ($allow_value) {
            $this->allow_value = $allow_value;
            $this->allow_list = $this->allow_list($allow_value, true);
        }
    }

    // 取得全部任務清單
    function case_list($mode = false) {
        $case_list = config($this->scene, 'allow');
        return $mode ? $case_list : array_keys($case_list);
    }

    // 取得用戶任務清單
    function allow_list($allow_value = 0, $mode = false) {
        $buffer = array();
        foreach ($this->case_list as $key => $value) {
            if ($allow_value & pow(2, $key - 1)) {
                $buffer[$key] = $value;
            }
        }
        return $mode ? $buffer : array_keys($buffer);
    }

    // 計算允許值(權限列表轉整數)
    function allow_value($allow_list = null) {
        if ($allow_list == null) $allow_list = $this->allow_list;
        array_walk($allow_list, function($value, $key) use(&$allow_list) {
            $allow_list[$key] = pow(2, $value - 1);
        });
        return array_sum($allow_list);
    }

    // 判斷是否允許某權限
    function is_allow($case) {
        $case_list = array_flip($this->case_list);
        return (bool)($this->allow_value & pow(2, $case_list[$case] - 1));
    }
}

使用示例

<?php
// 假設配置已載入,場景為 'access'
$auth = new s_allow('access', 0b10101); // 二進制 10101 = 權限 1,3,5 (add, read, mod)

// 判斷是否擁有 'add' 權限
if ($auth->is_allow('add')) {
    echo '允許新增';
}

// 獲取用戶所有權限標識
print_r($auth->allow_list()); // 輸出: Array ( [0] => add [1] => read [2] => mod )

// 從權限列表計算存儲值
$new_value = $auth->allow_value(['add', 'del', 'pub']); // 返回 2^0 + 2^1 + 2^6 = 67

原理解析

每個權限點對應一個二進制位(第 N 個權限對應 2^(N-1))。用戶的總權限值 $allow_value 即為其擁有的所有權限位通過按位或(|)合成的整數。驗證時只需 $allow_value & (2^(N-1)) 非零即表示擁有該權限。此方法極其節省存儲空間(一個整數存 32/64 個權限),且判斷速度極快。

總結

s_allow 類展示了位運算在權限系統中的優雅應用,結合 PHP 現代語法特性,代碼量極小卻功能完備。適合中小型項目快速接入,也可作為學習位掩碼權限設計的優秀範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved