Webシステムでは、ユーザー許可制御は非常に重要な部分です。合理的な許可システムは、システムの機密データを保護するだけでなく、ユーザーがアクセスすべきコンテンツのみにアクセスできるようにすることもできます。 PHPでは、 bindec()関数を使用してビット操作を組み合わせて、効率的で拡張しやすい許可制御メカニズムを構築できます。この記事では、これら2つを使用してユーザー許可システムを構築する方法を詳細に紹介します。
許可制御の中心的なアイデアは、各許可をバイナリビットに抽象化することです。たとえば、8ビット許可フィールドは8種類のアクセス許可を表すことができ、各ビットの1または0は許可が有効になっているかどうかを示します。
たとえば、次のアクセス許可が定義されているとします。
許可ポジション | 許可値 | 許可名 |
---|---|---|
0 | 1 | コンテンツを表示します |
1 | 2 | コンテンツを編集します |
2 | 4 | コンテンツを削除します |
3 | 8 | コンテンツを確認します |
4 | 16 | ユーザーを管理します |
5 | 32 | コンテンツを投稿します |
6 | 64 | レポートを表示します |
7 | 128 | スーパー管理者 |
ユーザーの権限は、有効化および無効化された一連の権限を表すバイナリ文字列( 「10101010」など)で表すことができます。 bindec()を使用してこの文字列を小数点に変換し、ビット操作を使用して、特定の許可が有効になっているかどうかを判断できます。
まず、特定のユーザーの許可値が170 、つまりバイナリで10101010であり、許可1、3、5、および7があると仮定します。
次のコードを使用して、特定の許可があるかどうかを判断できます。
<?php
// 許可定数を定義します
define('PERM_VIEW', 1); // 00000001
define('PERM_EDIT', 2); // 00000010
define('PERM_DELETE', 4); // 00000100
define('PERM_APPROVE', 8); // 00001000
define('PERM_USER', 16); // 00010000
define('PERM_PUBLISH', 32); // 00100000
define('PERM_REPORT', 64); // 01000000
define('PERM_ADMIN', 128); // 10000000
// ユーザーの許可値があると仮定します170(バイナリ10101010)
$userPermissions = 170;
// 編集許可があるかどうかを確認します
if ($userPermissions & PERM_EDIT) {
echo "ユーザーには編集権限があります";
} else {
echo "ユーザーには編集権限がありません";
}
?>
上記のコードは、 &オペレーターを使用して、指定された許可ビットが1かどうかを判断します。この方法では、ユーザーに特定のアクセス許可があるかどうかを簡単に判断できます。
ユーザーにアクセス許可を与えるには、許可ビット( | )を実行または計算する必要があります。
<?php
$userPermissions = 0; // 最初の許可はです0
// に追加“コンテンツを表示します”そして“コンテンツを投稿します”権限
$userPermissions |= PERM_VIEW;
$userPermissions |= PERM_PUBLISH;
echo $userPermissions; // 出力はです33
?>
特定の許可を取り消すには、非( &〜 )操作が必要です。
<?php
// 原始権限为:ブラウズ、編集、リリース(今すぐ 1 + 2 + 32 = 35)
$userPermissions = 35;
// 取り消す“編集”権限
$userPermissions &= ~PERM_EDIT;
echo $userPermissions; // 結果は次のとおりです33
?>
[ユーザーテーブルの[アクセス]フィールド、タイプintの[アクセス]フィールドなど、データベースフィールドに許可値を保存できます。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
permissions INT DEFAULT 0
);
ユーザーの権限を読み、確認してください。
<?php
// 假设从数据库中取出権限字段为 $permissions
$permissions = 170;
if ($permissions & PERM_DELETE) {
echo "コンテンツを削除できます";
} else {
echo "コンテンツを削除する許可はありません";
}
?>
バックグラウンド管理システムを例にとると、管理者がログインすると、システムは特定の関数ボタンを表示するかどうかを判断する必要があります。次のテンプレートで制御できます。
<?php
if ($adminPermissions & PERM_USER) {
echo '<a href="https://m66.net/admin/users">ユーザーを管理します</a>';
}
?>
ビット操作を通じて実装されたこの許可制御方法には、次の利点があります。
ストレージの節約:すべてのアクセス許可は1つの整数フィールドに統合され、スペースが節約されます。
効率的なクエリ:許可判決はビット操作を通じて完了し、速度は非常に高速です。
拡張機能の柔軟性:新しい許可ビットを追加して、新しい許可タイプを追加するだけです。
比較的固定された許可タイプを備えた中小規模のシステムまたはシナリオに適しています。システムの権限が複雑で、多次元制御が必要な場合は、データベースと組み合わせてRBAC(ロールベースのアクセス制御)モデルを使用して、より細かい粒状管理を実現することをお勧めします。
bindec()とBIT操作の組み合わせにより、シンプルで効率的なユーザー許可管理方法を実装できます。 PHPでバイナリと整数を操作するのは非常に便利であり、軽量の許可制御システムの構築に非常に適しています。実際のプロジェクトでは、保守性と読みやすさを高めるために、許可定数と判断のロジックをクラスまたは機能にカプセル化することをお勧めします。