ホームページ > バックエンド開発 > PHPチュートリアル > PHPビット操作に関する簡単な権限設計_PHPチュートリアル

PHPビット操作に関する簡単な権限設計_PHPチュートリアル

WBOY
リリース: 2016-07-20 11:16:50
オリジナル
946 人が閲覧しました

この記事は、PHP ビット操作の簡単なパーミッション設計を詳細に分析して紹介したもので、必要な方は参考にしてください。 ​

1.先頭に書きます
最近、許可処理について簡単なことを書きたいと思っています。また、2 進数のビット演算がこのタスクをうまく達成できることも学びました。 2進数のビット演算ですが、最も一般的なのは「OR、AND、NOT」の3つの単純な演算です。もちろん、PHPのマニュアルも確認しましたが、「XOR、左シフト」の3つの演算もあります。 、右シフト」。私が中学生のときに数学の先生が私に小言を言い始めたのを覚えています。ここではこの演算についての追加説明はせずに、本題に進みます。

2. 権限を定義する方法
2 の N 乗などに従って権限の値を定義します。なぜこのように定義するのでしょうか?この定義により、各アクセス許可値 (バイナリ) に 1 が 1 つだけ存在し、それが 1 つのアクセス許可に正確に対応することが保証されます。例:

コードをコピー コードは次のとおりです。
define('ADD', 1) // 権限を追加します
; define('UPD', 2) // 権限を変更します
; define('SEL', 4); // 権限を検索します
define('DEL', 8); // 権限を削除します。


3.許可操作
パーミッション操作には実際には「ロール」の概念が含まれます。権限操作の実行は、特定の権限を特定のロールに付与し、特定の権限を禁止し、特定のロールに特定の権限があるかどうかを検出することに他なりません。これら 3 つの操作に関連します。 2 進数間の算術演算を使用して簡単に実装できます。

コードをコピー コードは次のとおりです。
//「ビットごとの OR」演算子を使用して特定の権限を付与します
$a_access = ADD | SEL | // a には追加、削除、変更、チェックの権限があります。 $b_access = ADD SEL | // b には追加、変更、チェックの権限があります。 $c_access = ADD | // c には追加と変更の権限があります
// 特定の権限で「ビットアンド」演算子と「ビットノット」演算子の使用を禁止します
$d_access = $c_access & ~UPD; // d のみ権限が増加します
; // 特定の権限を持っているかどうかを検出するには、「ビット AND」演算子を使用します
var_dump($b_access & ADD); // 1 は b の権限が増加したことを意味します
var_dump($b_access & DEL); // 0 は b に削除権限がないことを意味します

4. 簡単な権限クラスとロールクラスを実装する
上記の権限操作メソッドを使用すると、簡単に権限クラスとロールクラスにカプセル化できます。
复制代码代码如下:
/**
* 単純な権限クラス
*/
クラス Peak_Auth {
/**
* 許可タイプのカウンター
* その機能は許可値を生成することです
*
* @var int
*/
保護された静的 $authCount = 0;
/**
*権限名
*
* @var 文字列
*/
保護された $authName;
/**
*許可の詳細
*
* @var 文字列
*/
protected $authMessage;
/**
*許可値
*
* @var int 2のN乗
*/
保護された $authValue;
/**
*コンストラクター
* 権限名、権限詳細、権限値を初期化します
*
* @param string $authName 権限名
* @param string $authMessage 権限の詳細
*/
パブリック関数 __construct($authName, $authMessage = '') {
$this->authName = $authName;
$this->authMessage = $authMessage;
$this->authValue = 1 << self::$authCount;
self::$authCount++;
}
/**
* このクラスはオブジェクトのコピー操作を許可しません
*/
プライベート関数 __clone() {

}
/**
* 権限の詳細を設定します
*
* @param string $authMessage
*/
パブリック関数 setAuthMessage($authMessage) {
$this->authMessage = $authMessage;
}
/**
* 権限名を取得します
*
* @戻り文字列
*/
パブリック関数 getAuthName() {
$this->authName を返す;
}
/**
* 許可値を取得します
*
* @return int
*/
パブリック関数 getAuthValue() {
$this->authValue を返す;
}
/**
* 許可の詳細を取得します
*
* @戻り文字列
*/
パブリック関数 getAuthMessage() {
$this->authMessage;
を返す }
}
/**
* 簡単な文字クラス
*
* @著者27_Man
*/
クラス Peak_Role {
/**
※キャラクター名
*
* @var 文字列
*/
保護された $roleName;
/**
* ロールが所有する権限の値
*
* @var int
*/
保護された $authValue;
/**
* 親ロールオブジェクト
*
* @var Peak_Role
*/
保護された $parentRole;
/**
*コンストラクター
*
* @param string $roleName ロール名
* @param Peak_Role $parentRole 親役割オブジェクト
*/
パブリック関数 __construct($roleName, Peak_Role $parentRole = null) {
$this->roleName = $roleName;
$this->authValue = 0;
if ($parentRole) {
$this->parentRole = $parentRole;
$this->authValue = $parentRole->getAuthValue();
}
}
/**
* 親ロールの権限を取得します
*/
保護された関数 fetchParenAuthValue() {
if ($this->parentRole) {
$this->authValue |= $this->parentRole->getAuthValue();
}
}
/**
※許可をお願いします
*
* @param Peak_Auth $auth
* チェーン操作用の @return Peak_Role
*/
パブリック関数allow(Peak_Auth $auth) {
$this->fetchParenAuthValue();
$this->authValue |= $auth->getAuthValue();
$this を返します;
}
/**
* 特定の権限をブロックします
*
* @param Peak_Auth $auth
* チェーン操作用の @return Peak_Role
*/
パブリック関数拒否(Peak_Auth $auth) {
$this->fetchParenAuthValue();
$this->authValue &= ~$auth->getAuthValue();
$this を返します;
}
/**
* 特定の権限があるかどうかを確認してください
*
* @param Peak_Auth $auth
* @return boolean
*/
パブリック関数 checkAuth(Peak_Auth $auth) {
return $this->authValue & $auth->getAuthValue();
}
/**
* ロールの権限値を取得します
*
* @return int
*/
パブリック関数 getAuthValue() {
$this->authValue を返す;
}
}


5.对权制限と角色クラスの简单操作例

コードをコピー コードは次のとおりです。


// 読み取り可能、書き込み可能、​​実行可能の 3 つの権限を作成します
$read = new Peak_Auth('CanRead');
$write = new Peak_Auth('CanWrite');
$exe = 新しい Peak_Auth('CanExe');
//ロールユーザーを作成します
$user = 新しい Peak_Role('ユーザー');
//User のすべての権限を持つ別のロール Admin を作成します
$admin = 新しい Peak_Role('Admin', $user);
// ユーザーに読み取りおよび書き込み可能な権限を与えます
$user->allow($read)->allow($write);
//管理者に実行権限を与えると、ユーザー権限も付与されます
$admin->allow($exe);
// 管理者の書き込み権限を無効にする
$admin->deny($write);
// 管理者に特定の権限があるかどうかを確認します
var_dump($admin->checkAuth($read));
var_dump($admin->checkAuth($write));
var_dump($admin->checkAuth($exe));

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/372287.html技術記事この記事は、PHP ビット操作の簡単なパーミッション設計の詳細な分析と紹介です。必要な方は、1 を参照してください。最近、パーミッション処理について簡単なことを書きたいと思いました。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート