1

グループに基づいて特定のアクション/権限をユーザーに付与する最良の方法は何ですか? user、admin、accountant の 3 つのグループがあるとします。ユーザーは、action1、admin - action1,2,3、accountant - action1 および 2 を実行できます。次のようになります。

if(group == user){ action1(); //function }
if(group == admin){ action1(); action2(); action3(); }
if(group == accountant){ action1(); action2(); }

すべてのアクションは functions.php ファイルに保存され、ページに含まれます。それは良い考えでしょうか、それとももっと良い解決策がありますか?

4

3 に答える 3

4

などのコンパレータを使用する

if (admin) {do x}
else if (user) {do y}

柔軟性がなく、うまくスケーリングできないため、悪い考えです。

いくつかのオプションがあります。権限が階層的である場合、つまり、1 人のユーザーがすべてを実行でき、下位のユーザーは上位のユーザーよりも権限が少ないことを意味します。

admin - 1, 2, 3
accountant - 1, 2
user - 1

次に、数字を与えて言うことができます

if (permissionValue => 500)
{
    action2();
}

そして、テーブルを用意してください:

admin        1000
accountant   500
user         250

これにより、管理者と経理担当者の間に新しいユーザー タイプ (モデレーターなど) を追加できますが、次の場合は機能しません。

admin        1, 2, 3
accountant   1, 2
moderator    1, 3
user         1

モデレーターと経理担当者の権限は同じレベルにあるためです。

最良の解決策は、ビット単位の演算子を使用し、バイナリ値を保護領域に割り当てることです。

ユーザーがコンテンツを読み取ることができ、モデレーターがコンテンツを読み書きでき、管理者がコンテンツを読み書きおよび削除できるという簡単な例を考えてみましょう。次の表が得られます (値はビットごとの or 演算子を使用して構築されます)

Users:          Read    Write    Delete
admin:     7 - (0b001 | 0b010 |  0b100)  = 0b111 = 7
moderator: 3 - (0b001 | 0b010 |  NO   )  = 0b011 = 3
user:      1 - (0b001 | NO    |  NO   )  = 0b001 = 1

その後、次のことができます。

//Permissions:
define('READ', 1);
define('WRITE', 2);
define('DELETE', 4);

if ($userPermissions & READ)
{
    //Allowed to Read
}


if ($userPermissions & WRITE)
{
    //Show write form
}

これらはビット演算子の例です。これは、x にビット y が含まれている場合に true を返すことを意味します。書き込み機能について

User         Permission
User            Write
1        &        2
0b001    &      0b010 -- returns false
Admin           Write
7        &        2
0b111    &      0b010 -- returns true

最初の例では、0b001 にはビット 0b010 が含まれていないため、false が返されます。0b111 にはビット 0b010 が含まれており、true を返します。

詳細はこちら

于 2010-10-09T18:40:50.080 に答える
1

ユーザーは複数のグループに所属できますか? そうでない場合は、データベースにテーブルを作成します。

Group
group_id   INT (for sorting)
group_name VARCHAR
user_id    INT

それ以外の場合は、テーブルGroup | group_id, group_nameとテーブルを作成しますGroup_User_affiliation | group_id, user_id

明らかに、これらを命名スキームに合わせてください。

OOP アプローチ (Userクラスを使用) が既にある場合は、フィールドを追加します.groupSTRING get_group(INT $user_id)それ以外の場合は、データベースにクエリを実行するなどの関数を作成します。

于 2010-10-09T18:40:36.417 に答える
0

データベースに別の 2 つのテーブルを作成します。たとえばpermissions、id と name の 2 つのフィールドだけで、さらにもう 1 つ (人間が読むため) のタイトルを付けます。そして二つ目―― groups_permissions。次に、「action_one」、「action_two」、「and_another_action」などの権限を追加します。

次に、php 自体で、次のようなアクセス許可を確認します。

if ( has_permission('action_one') ) {
    action_one();
}

この方法は、おそらく 3 つのグループしかないタスクでは少しオーバーヘッドがかかりますが、後でさらにグループを追加した場合に役立つことがわかります。

または、次のように構成ファイルを作成してアクセス許可をリストするハードコードされた方法を知っています。

$permissions['admin'] = array('create_all', 'delete_all', 'update_all', 'ban_users', 'etc.');
$permissions['moderator'] = array('update', 'delete');
$permissions['user'] = array('view_members_area', 'create_post', 'update_own', 'etc');

そして、上記の方法のように、アクションを呼び出す前に関数を介して許可を確認してください

于 2010-10-09T20:40:07.550 に答える