ネイティブ PHP クロスメンバーシップ権限制御に基づく
Web サイトのバックエンド管理システムの場合、単一のスーパー管理者権限ではニーズを満たせないことがよくあります。特に大規模な Web サイトでは、この単一の権限が多くの問題を引き起こします。
例: Web サイト編集者は、通常、会社の Web サイトの発表と更新のみを担当しますが、Web サイトのバックエンドに厳格な権限制限がない場合、顧客の情報の一部を操作することができます。これは大きな隠れた問題です。危険。
ThinkPHP フレームワークを学習したことがある場合は、RBAC と呼ばれるものがあることを知っているはずです。今日はそれについては説明しませんが、ネイティブ PHP 言語で権限間の制御を実装する方法について話しましょう。
さて、あまり言うことはありません。いつものように原則とコードについて話しましょう。
アクセス許可の相互制御を実装する方法はたくさんあります。ここでは 1 つのアイデアを紹介します: (私は 2 進数の方法を使用します)。
1. ここで、まずビットごとの AND とビットごとの OR の演算方法について説明します。
1. ビット単位の AND 演算子 (&)
演算に参加する 2 つのデータは、バイナリ ビットに従って AND 演算されます。 (「AND」演算 => 7&8=0 のような値が含まれるかどうか)
操作ルール: 0&0=0; 1&1=1;
つまり、2 つのビットが同時に「1」の場合、結果は「1」になり、それ以外の場合は 0 になります
例: 3&5 は 0000 0011 & 0000 0101 = 0000 0001 したがって、3&5 は 1 の価値があります。
さらに、負の数値は 2 の補数形式でビット単位の AND 演算に参加します。
2. ビット単位の OR 演算子 (|)
操作に参加する 2 つのオブジェクトは、バイナリ ビットに基づいて「OR」操作を実行します。 (「OR」演算 => 7=4|2|1 などの値を含めることができます。7^2 などの含まれる値を削除するには「XOR」を使用します)
操作規則: 0|0=0; 1|0=1;
つまり、操作に参加している 2 つのオブジェクトのうちの 1 つが 1 である限り、その値は 1 です。
例: 3|5 つまり 0000 0011 | 0000 0101 = 0000 0111 したがって、3|5 は 7 の価値があります。
さらに、負の数値は 2 の補数形式でビット単位の OR 演算に参加します。
ビットごとの AND とビットごとの OR の演算を理解して、次の例を見てみましょう:
コードをコピー
1
2 define('ADD',1);//バイナリ 1
3 define('DELETE',2);//バイナリ 10
4 define('UPDATE',4);//バイナリ 100
5 define('SELECT',8);//バイナリ 1000
6
7 //許可があれば1、許可がなければ0
8 $admin=追加|削除|更新|選択;//1111
9 $editor=追加|更新|選択;//1101
10 $user=SELECT;//1000
11 ?>
コードをコピー
それぞれ追加、削除、変更、確認の4つの権限を作成し、定数として設定しました
二進数の 1 は 1、二進数の 2 は 10、二進数の 4 は 100、二進数の 8 は 1000、これは単なるルールです
上記の権限変数 admin、editor、user に対応する 1111、1101、および 1000 はどこから来たのかを尋ねる友人もいるかもしれません。
PHPにはdecbin()という10進数を2進数に変換する関数があります
以下は対応する機能の説明です:
コードをコピー
デクビン
(PHP 3、PHP 4、PHP 5)
decbin -- 10 進数を 2 進数に変換します
手順
文字列 decbin (int 数値)
指定された数値パラメータのバイナリ表現を含む文字列を返します。変換できる最大値は 10 進数で 4294967295 で、結果は 32 個の 1 の文字列になります。
例 1. decbin() の例
エコー decbin(12) . "n";
bindec()、decoct()、dechex()、およびbase_convert()を参照してください。
コードをコピー
出力をテストして見てみましょう:
コードをコピー
1
2
3
4 define('ADD',1);//バイナリ 1
5 define('DELETE',2);//バイナリ 10
6 define('UPDATE',4);//バイナリ 100
7 定義('SELECT',8) //バイナリ 1000
;
8
9 //許可があれば1、許可がなければ0
10 $admin=追加|削除|更新|選択;//1111 15
11 $editor=追加|更新|選択;//1101 13
12 $user=SELECT;//1000 8
13
14 echo decbin($admin)."
";
15 echo decbin($editor)."
";
16 echo decbin($user)."
";
17
18
19 ?>
コードをコピー
出力結果:
次に、この操作を使用して権限を決定します。1 は権限があることを意味し、0 は権限がないことを意味します
例:
管理者(スーパー管理者)の権限は追加、削除、変更、確認であり、1111——>0000 1111です
編集者 (ウェブサイト編集者) には、追加、変更、確認する権限があります。これは 1101——>0000 1101 です
ユーザー (一般ユーザー) には閲覧とクエリの権限のみがあり、1000—>0000 1000 です
その後、ビット単位の AND 演算を実行して、許可があるかどうかを判断するだけです
例: (後ろから前に見て) 10進数(データベースストレージタイプの値)を2進数に変換し、「AND」演算を実行します
ウェブサイトの編集権限 0000 1101 (権限の 10 進数は 13) & 0000 0010 (削除権限は 10 進数の 2 で、2 進数の 10 に変換されます) 結果: 0000 0000、権限が取得されていないことを意味します
もう一度試してください
通常のユーザー権限 0000 1000 & 0000 0001 (10 進数で権限を加算 = 2 進数で 1) 結果: 0000 0000 にも権限がありません
スーパー管理者権限 0000 1111 & 0000 1101 (Web サイト編集権限) 結果: 0000 1101、つまり Web サイト編集権限があることを意味します
それでは、具体的な例を見てみましょう
2つのテーブルを含むデータベースを構築しました
1 つはユーザー テーブルです:
gidは権限テーブルのグループIDを表します
1 つは許可テーブルです:
フラグは追加、削除、変更、確認の権限を表し、必要に応じて定義できます
基本設定ページ: config.php
コードをコピー
1
2
3 定義('HOST','localhost');
4 定義('DBNAME','メンバー');
5 定義('ユーザー', 'ルート');
6 定義('PASS', '');
7
8
9 $link=@mysql_connect(HOST,USER,PASS) または die('データベース接続に失敗しました');
10
11 mysql_select_db(DBNAME,$link);
12
13 define('ADD',1);//バイナリ 1
14 define('DELETE',2) //バイナリ 10
;
15define('UPDATE',4);//バイナリ100
16 define('SELECT',8) //バイナリ 1000
;
17
18 //許可があれば1、許可がなければ0
19 $admin=追加|削除|更新|選択;//1111
20 $editor=追加|更新|選択;//1101
21 $user=SELECT;//1000
22 ?>
コードをコピー
ホームページにログインします:index.html
コードをコピー
1
2
3
4
5
ドキュメント
6
7 <ボディ>
8
9 账号:
10 秘密:
11
12
13