4

このカスタマイズされた ACL システムを実装するために必要なデータベースと php コードは既に作成しています。今、私は現在のユーザーを「承認」する必要があり、そこにあなたのアドバイスが必要です。

システムは、システム ユーザーとシステム モジュールの両方に対する柔軟な権限割り当てに基づいています。また、完全にカスタマイズされたグループを作成する機能を備えた、事前定義された、たとえばユーザーグループもあります。グローバル ルールは ACL の上に適用することもできますが、グループまたはユーザーに割り当てられたアクセス許可よりも優先度が低くなります。

それをよりよく描写するには:

定義済みグループ:

  1. 限定(アクセス不可)
  2. 基本的なユーザー
  3. パワーユーザー
  4. 管理者
  5. 訪問者 (カスタマイズされたグループのサンプル)

アクセス レベル (名前と値のペア) は次のとおりです。

  • 許可しない / 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 に優先順位を付ける (上書き/置換する) 効率的な方法について何か考えはありますか?

DenyAllowは最高Disallowです。またUser、割り当てられた ACL が最も高く、次にGroupACL、最後にGlobalACL です。

これが私が最終的に思いついたものです:

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;

私はそれが完全に機能すると思います、何かアイデアはありますか?

それは今かなりうまくいきます:)

4

2 に答える 2

2

MVC 環境でこれを処理する方法は次のとおりです。この構造のテーブルを作成します。

(id, group_id(int), user_id(int), controller(varchar), action(varchar)) 

次に、グループと user_id に -1 を使用してワイルドカードを表し、* をコントローラーとアクションに使用します。したがって、あなたの例では、管理者は何でもできます (1,4,-1, , )。または、パワー ユーザーがユーザー (2,3,-1,user,*) を変更できるとします。または、どのグループ (3,-1,34,user,update) に属しているかに関係なく、1 人のユーザー (user_id が 34) に許可を与えたい場合。許可、不許可のために 0 ~ 3 を保存したい場合は、列を追加するだけです。次に、どのコントローラーとアクションが呼び出されているかを確認し、その人のグループに適用されるアクセス許可と、特にそれらに適用されるアクセス許可を見つけます。

于 2012-09-11T13:39:30.900 に答える
1

パーミッション/グループテーブルを作成するだけです:

id, group/permission name

次に、グループをユーザーにリンクする多対多のテーブルを作成します。

id, user_id, group_id

グループ権限のみを使用している場合は、アクセス レベルは必要ありません。

次に、コードで、次のようにグループのユーザーを確認します。

function checkAccess($pageLevelRequired)
{
  // run query based on current user session id
  // run your query to check if the current user belongs to the group required to view this page.
}

わかる?

于 2012-09-11T13:01:56.687 に答える