2010-12-06 3 views
4

私はvBulletinがbitpermsを使用していることを知っていますが、私もそれらを使用していましたが、10^63になったとき、彼らは動作を停止しました。使用するのに適した権限システムは何ですか?

myBB, PhpBB, IPB, Joomlaと他のスクリプトがネットワーク上でパーミッションシステムに使用されているのを知りたいのですが、本当にスクリプト内の高速アクセス許可設定を使用したいのです。今私はpermgroupsと呼ばれる各ユーザーのSQL変数を実装した1,4,5のような値を持ち、それらの番号のそれぞれは、私が持っている各ページに対応するcanseepages 1,2,3,4,1,4,1,54,6,4,5,22,6,2,3,4,1,2と呼ばれる同様の変数を持つアクセス許可グループに対応しています。

まず私は、私は、ユーザーが私はSQLクエリを実行するforeach内

をすべてのパーマグループのforeachのを見ることができますそれから私は、PHPのpermgroups

に爆発使うPHP

でpermgroupsを選択私はMASSIVE何かのよう

で終わるので、私は、変数にこれを追加し

権限グループから変数canseepagesをつかむために3210

$variable = '1,2,3,4,5,6,7,8,9,2,22,55,44,55,33,44,11,44,33,44,11,33,44,'. 
'22,33,44,11,22,33,44,33,11,22,33,44,33,22,33,44,55,44,'. 
'55,54,26,77,84,645,345,233,11,4,11,3,32'; 

この変数は、ユーザーが表示できるすべてのページを表します。私は数字の配列にそれを爆発させ、彼らが閲覧しようとしている現在のページが彼らが見ることが許可されているページの配列内にあるかどうかを確認するためにin_array()を使用します。

これはかなり速いですが、私は一般的にこのすべてをやるより速い方法がなければならないと考えています。

+0

ロールベースのアクセス制御? – Tower

答えて

1

私はそのビットマスクは、ユーザーのアクセス許可のための最善の解決策だった長い時間戻って考え出し:

ショート例:

class UserPermissions() 
{ 
    private $Mask = 0; 

    //Levels 
    const PUBLIC_READ = 1; 
    const PUBLIC_WRITE = 2; 
    const PUBLIC_EDIT = 4 
    const PUBLIC_DELETE = 8; 
    //ETC 

    public function __construct($Mask) 
    { 
     $this->Mask = $Mask; 
    } 

    public function InvokePermission($Bit) 
    { 
     return ($Mask & $Bit); //True/False 
    } 

    public function AddPermission($Bit) 
    { 
     $this->Mask |= $Bit; //Add the bit to the mask 
    } 

    public function RevokePermission() 
    { 
     $this->Mask &= ~ $Bit; 
    } 

    public GetMask() 
    { 
     return $this->Mask; 
    } 
} 

そうのような単純な使用:

$Permissions = new UserPermissions($User->PermissionsData); 

if($Permissions->InvokePermission(Permissions:: PUBLIC_EDIT)) 
{ 
    //Use can edit 
} 

一部のリンク:

+0

定数ではなく、一連の "isBLANK"メソッドを使用した方が少し自然なことはありませんか?それから私は上記のコードを減らすことができるのであれば($ Permissions-> isPublicEdit()){}(他のアクションのための同上) – DampeS8N

+0

は、その後、あなたのシステムが大きくなるにつれて、あなたは、次の最良のシナリオが使用するようuneeded方法の多くを持っています静的ではなく、同じメソッドの実装ではなく、 '$ Permissions-> SetBitField($ DB ['fields'])'を動的にロードして、ACP内に新しい権限タイプを動的に追加できるようにします。 – RobertPitt

4

これはあなたにはあてはまらないかもしれませんが、通常は個々のページではなくシステムのセクションに権限を適用します。例えば、あなたはadmin権限を持っていて、大きなadminyセクションをすべてロックすることができます。

システムにユーザーを追加、編集、削除する機能をロック解除するマネージャーパーマネントを使用できます。それらのもののすべてではなく、そのうちの1つを行うことができる人が必要であることは非常にまれです。

代わりに、タスク固有の権限システムがあります。このサイトは1つを使用しています。

0

整数の配列をビットマスクとして使用しないのはなぜですか?次に、あなただけの

$ndx = $pageNo/PHP_INT_SIZE; 
$bit = $pageNo % PHP_INT_SIZE; 
$canAccess = $permArray[$ndx] & (1<<$bit); 

$pageNoような何かを、ユーザーがアクセスしようとしているページの数は、$permArrayは、グループの許可のページを表す整数の配列です。ページに対応するビットがセットされている場合、ユーザはそのページにアクセスすることができる。

(申し訳ありませんが、構文が間違っていると、私は長い間PHPを使用していません。)

関連する問題