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

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

WBOY
リリース: 2016-07-21 15:01:30
オリジナル
750 人が閲覧しました

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 = SEL | // a には権限があります。追加、削除、変更、確認する
$ b_access = ADD SEL; // b は追加、変更、確認する権限を持ちます
$c_access = ADD | / 特定の権限に対する「ビット AND」および「ビット NOT」演算子の使用を禁止します
$d_access = $c_access & ~UPD; // d のみが権限を増加させます
// 特定の権限があるかどうかを検出するには、「 bit AND" 演算子
var_dump($b_access & ADD); // 1 は b が持っていることを意味します 権限を増やします
var_dump($b_access & DEL); // 0 は b が削除権限を持っていないことを意味します


4. 単純な権限を実装しますクラスとロールクラス
上記のパーミッション操作メソッドを使用すると、単純にパーミッションクラスとロールクラスにカプセル化できます。

コードをコピーします コードは次のとおりです:

/**
* 単純な権限クラス
*/
class Peak_Auth {
/**
* 権限タイプカウンター
* 権限値の生成に使用されます
*
*/
protected static $authCount = 0;
/**
* 権限名
*
* @var string
*/
protected $authName;
/**
* 権限の詳細
*/
protected $authMessage;
/**
*/
protected $authValue;
/**
* コンストラクター
* 権限名、権限の詳細、権限の値を初期化します
*
* @param string $authName 権限名
* @param string $authMessage 権限の詳細
*/
public function __construct($authName, $authMessage = '') {
$this ->authName = $authName;
$this->authMessage = $authMessage;
$this->authValue = 1 << self::$authCount;
self::$authCount++;
}
/**
* このクラスではオブジェクトのコピー操作は許可されません
*/
private function __clone() {

}
/**
*/
public function setAuthMessage($authMessage ) {
$this->authMessage = $authMessage;
}
/**
*/
public function getAuthName() {
return $this->authName;
}
/**
* /
public function getAuthValue() {
return $this->authValue;
}
/**
* 許可の詳細を取得します
*/
public function getAuthMessage() {
return $this->authMessage;
}
}
/**
* シンプルなキャラクタークラス
*
* @author 27_Man
*/
class Peak_Role {
/**
* キャラクター名
*
* @var string
*/
protected $roleName;
/**
* ロールが所有する権限の値
**/
protected $authValue;
/**
* 親ロールオブジェクト
*
* @var Peak_Role
*/
protected $parentRole;
/**​​​​*/
public function __construct($roleName, Peak_Role $parentRole = null) {
$this->roleName = $roleName;
$this->authValue = 0;
if ($parentRole) {
$this->parentRole = $parentRole;
$this->authValue = $parentRole->getAuthValue();
}
}
/**
* 親の役割の権限を取得します
*/
保護されていますfunction fetchparenauthvalue(){
if($ this-&gt; parentrole){
$ this-&gt; authvalue | = $ $ this-&gt; parentrole-&gt; getauthvalue(); /
public functionallow(Peak_Auth $auth) {
$this->fetchParenAuthValue();
$this->authValue |= $auth->getAuthValue();
return $this;
}
/**
*許可を与える
*
* @param peak_auth $auth
*/
public functiondeny(Peak_Auth $auth) {
$this->fetchParenAuthValue();
$this->authValue &= ~$auth->getAuthValue();
return $this;
}
/**
*/
public function checkAuth(Peak_Auth $auth) {
return $this->authValue & $auth->getAuthValue();
}
/**
*/
public function getAuthValue() {
return $this->authValue;
}
}



5.对权制限类和角色类的简单操作例子




复制發

代码如下:

//読み取り可能、書き込み可能、​​実行可能の 3 つの権限を作成します
$read = new Peak_Auth('CanRead');
$write = new Peak_Auth('CanWrite');
$exe = new Peak_Auth('CanExe ');
// ロールを作成します User
$user = new Peak_Role('User');
// User
$admin = new Peak_Role('Admin', $user );
のすべての権限を持つ別のロール Admin を作成します//ユーザーに読み取りおよび書き込み権限を与えます
$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/327987.html技術記事 1. 先頭に書いてください。最近、許可処理について簡単なことを書きたいと思いました。また、2 進数のビット演算がこのタスクを見事に達成できることも学びました。 2進数のビットについて...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート