このカスタマイズされた ACL システムを実装するために必要なデータベースと php コードは既に作成しています。今、私は現在のユーザーを「承認」する必要があり、そこにあなたのアドバイスが必要です。
システムは、システム ユーザーとシステム モジュールの両方に対する柔軟な権限割り当てに基づいています。また、完全にカスタマイズされたグループを作成する機能を備えた、事前定義された、たとえばユーザーグループもあります。グローバル ルールは ACL の上に適用することもできますが、グループまたはユーザーに割り当てられたアクセス許可よりも優先度が低くなります。
それをよりよく描写するには:
定義済みグループ:
- 限定(アクセス不可)
- 基本的なユーザー
- パワーユーザー
- 管理者
- 訪問者 (カスタマイズされたグループのサンプル)
アクセス レベル (名前と値のペア) は次のとおりです。
- 許可しない / 0
- 許可 / 1
- 拒否 / 2
- 所有者 / 3 の場合に許可
注: 「許可」は「許可しない」より優先度が高いため、ユーザー X がグループ A で「許可されていない」が、特定のアクセスでグループ B で「許可」されている場合、彼は最終的に「許可」されます。一方、ユーザー X が「管理者」グループのメンバーであることによって「フル アクセス」を持っているが、特定のアクセスを単に「拒否」した場合、彼は最後にアクセス権を持っていない、つまり「拒否」を意味します。 「許可」の優先度が高くなります。
トップレベルでは、次のようなものがあるかもしれません:
- "Administrator" * "1" は、管理者がシステムにフル アクセスできることを意味します。
- "ビジター" * "0" は、ビジターが何にも許可されていないことを意味します
私の質問は、これらの種類のチェックを処理する方法ですか? シンプルな認証メカニズムがあると想像してください。$_SESSION['user']
like$_SESSION['user']['login'] = true;
とにはいくつかのインデックスがあります$_SESSION['user']['id'] = $row['user_id']
よね?
さて、このメカニズムをスクリプトに実装したい場合、どのように実装するのでしょうか?
まず、グローバル アクセス ルールを確認します。次に、ユーザーがすでにログインしているかどうかを確認します。はいの場合は、すべてのグループを取得し、アクセス許可のテーブルを調べて、グループとユーザー ID に割り当てられているアクセス許可を確認し、それらをユーザー セッションに保存します。次に、これが実行に必要なアクセス許可であるとモジュールが言うと、ユーザーが要求されたモジュールへの十分なアクセス権を持っているかどうかを確認します。
かなり複雑に見えます!どんな助けやアドバイスも大歓迎です!:)
編集:
私はフレームワークを使用していません。実際に使っていますが、自前です。したがって、ここには事前に作成された ACL はありません。
アップデート:
ACL に優先順位を付ける (上書き/置換する) 効率的な方法について何か考えはありますか?
Deny
Allow
は最高Disallow
です。またUser
、割り当てられた ACL が最も高く、次にGroup
ACL、最後にGlobal
ACL です。
これが私が最終的に思いついたものです:
Array
次のようながあります。
$_SESSION['ACL'][$module][$action] = $access_level; // 0, 1, 2, 3
まず、すべての Global Rules を探して、*
それらを配列に配置します。
// The current user can see the map, applied by a global rule
$_SESSION['ACL']['map']['render'] = 1;
// All the other permissions are disallowed by default
$_SESSION['ACL']['*']['*'] = 0;
// He can edit his preferences, (Owner)
$_SESSION['ACL']['user']['*'] = 3;
次に、グループ ベースの ACL を探します。
// User could access the Analyze module, all the methods
// with Permission Name "report". Applied by being a member
// of "Moderator" Group
$_SESSION['ACL']['analyze']['report'] = 1;
// User NOT allowed to access "groups" module, let say
// it reserved for "admin" group! - To see the ACLs' Overwriting!
$_SESSION['ACL']['groups']['*'] = 0;
結局のところ、ユーザーが割り当てた ACL を探します。
// User have Full Access to the "groups" module.
// It's gonna replace the last ACL, applied by "Moderator" group
// Note that the order of processing ACLs is IMPORTANT!
$_SESSION['ACL']['groups']['*'] = 1;
私はそれが完全に機能すると思います、何かアイデアはありますか?
それは今かなりうまくいきます:)