この問題には2つの一般的なアプローチがあります。どちらも、許容される操作を名前を付けることのできる別のものに分割することです。 (ポストを削除する、ギャラリーを作成する、コードをアップグレードする、データベースをダンプする、ミサイルを起動する、ガレージドアを開く)ビットベクトルでビットマップを1つずつ与えます(32未満のアクセス権を持つ予定の場合、
したがって、ユーザーを直接アクセス許可にマップすることができます(「I 「をsarnold
に付与したい)、またはユーザークラスを使用してユーザーとアクセス許可を割り当てることができます(「art_curator
クラスのすべてのメンバーにgallery_create
を付与してからsarnold
をdocent
からart_curator
に昇格させます)。
ユーザーをアクセス許可に直接マッピングすると、後で展開するときに奇妙なアクセス許可が見つかることがあります。ユーザーをクラスにマッピングすると、特権を持つ特定の人物を信頼するため、他の特権は信頼できないため、人工クラスのユーザーがいるかもしれません。
このマッピングに対処する最善の方法を解明することは、まだ未解決の問題です。私はあなたのシステムがどれほど複雑になるかによって、あまりにも多すぎるかもしれないし、情報が少なすぎるかもしれない異なるタイプの許可モデルModelling a permissions systemについて書いています。
あなたはビットマップでちょうどストアの権限(例えば、LinuxのカーネルのCAP_SYS_ADMIN
ためCAPABLE()
の実装、CAP_DAC_OVERRIDE
、など)は、あなたがして、新しい権限を追加することができますしたい場合に非常に単純なもの:
if (requested_new_permission == "CAP_SYS_ADMIN")
user->permissions |= CAP_SYS_ADMIN;
else if (requested_new_permissions == "CAP_DAC_OVERRIDE")
user->permissions |= CAP_DAC_OVERRIDE;
if (CAPABLE(user, CAP_SYS_ADMIN))
reboot_server();
と:そして、あなたが機能をテストする必要があるとき...
CAPABLE()
は次のように見ることができますマクロ:
できるの#define(ユーザー、キャップ)((ユーザー) - >権限&(キャップ))
(Cを許して、私は非常によく、PHPを知りません。私はあまりにも多くのPHPバグを修正して、自分でそれを学びたいと思っていました。)
、ユーザークラスを介してアクセス権をユーザーにマップする場合、それは3つの表のようになります。users
テーブル、groups
またはclasses
テーブル、およびpermissions
テーブル。 classes
にはuser_id
とpermission_id
の列があります。アクセス権を付与できるかどうかを確認する必要がある場合は、そのユーザーのクラスを選択し、そのクラスのアクセス権を選択します。 (これは、私が手書きのSQLを書いてから数年経ちましたが、1つのクエリでは、はいまたはいいえの回答が得られるはずですが、複数のテーブル結合またはサブクエリを使用するかどうか、データベースへの2つのクエリを作成するほうが簡単でしょう:)
これは役に立ちます。
PEAR Live_Userをご覧ください。これは古くて標準的なものではありませんが、ほとんどの権限管理に対応しています。 – mario