3

ユーザーがいるPHPでアプリケーションを作成しました。ユーザーにはさまざまなレベルがあります.1、2、3、4としましょう。ユーザーがログインすると、レベル番号を含むセッションが設定されます。アプリケーションは、次のようにユーザー レベルに応じて異なるページを表示します。

if($role_level > 3)
{
    //Show something
}

ここで、ユーザーが新しいユーザーを追加し、おそらくドロップダウン (html 選択) ボックスからロールを定義できるユーザー追加セクションを作成したいと考えています。しかし、彼らは自分よりも低い役割しか定義できません。私はこのようなことを考えています:

<select>
    ("SELECT * FROM `roles` WHERE `roles_level` < $role_level)
    loop results into <options></options>
</select>

これについて何かコメントはありますか?それについてもっと良い方法はありますか?上記は影響しますか?

4

6 に答える 6

5

あなたのアイデアは実行可能に見えますが、ロール間の単一の直接階層が可能になるため、あまり柔軟ではありません。役割の分岐が必要な場合はどうしますか? たとえば、現在の 1、2、3、および 4 として、「ユーザー」、「発行者」、「レビュー担当者」、および「管理者」がいる場合があります。

ユーザーは記事を読むことしかできず、発行者は記事を書いて編集することもでき、レビュアーは他の発行者の記事を編集することもでき、管理者は管理作業も行うことができます。

モデレーターの役割が必要な場合はどうしますか? モデレーターは、誰の記事でも編集できますが、新しい記事を書くことはできません。それをどのように実装しますか?現行モデルではできません。

「ロール」テーブル、「アクション」テーブル、およびそれらの間の NM 関係テーブルを定義することをお勧めします。

役割:

  • 1、ユーザー
  • 2、出版社
  • 3、レビュアー
  • 4、管理人
  • 5、記事_モデレーター

行動:

  • 1、read_post
  • 2、書き込み_投稿
  • 3、edit_own_post
  • 4, edit_others_post
  • 5、管理ツール

Roles_Actions:

  • 1,1
  • 2,1
  • 2,2
  • 2,3
  • 3,1
  • 3,2
  • 3,3
  • 3,4
  • 4,1
  • 4,2
  • 4,3
  • 4,4
  • 4,5
  • 5,1
  • 5,4 (モデレーター (5) は write_own_post も edit_own_post もできず、edit_others_post のみであることに注意してください)

確かに、これはより複雑ですが、将来に向けてより柔軟です

この回答も読むことをお勧めします: ACL の概念を説明する @Vyktor によるLINKは、大規模なプロジェクトに役立ちます。

于 2013-04-16T08:54:35.950 に答える
1

アクセス許可を含むテーブルを作成できます。また、レベル数がそれほど多くない場合は、さまざまなパーツへのさまざまなアクセス権を持つさまざまな db アカウントを作成することもできます。

オプションを表示するだけでは不十分で、サーバー側で権限を確認する必要があります。

@STT LCUが言ったように、アクションとユーザー(ロール)を作成できます。

しかし、これは十分ではありません。コードまたはパーミッション チェッカーのようなクラスが必要だからです。

if($perm->IsHaveAccess('editing_post')){
//the logic
}
于 2013-04-16T09:02:32.077 に答える
1

すべての数が利用可能であることがわかっている場合 (つまり、1、2、5、6、20 にはならない)、次のようにする方がはるかに簡単です。

foreach(range(1,$role_level-1) as $level):
    echo "<option value='$level'>Level $level</option>";
endforeach;

そして、はい、あなたのアイデアは、基本的な許可システムを実行するのに十分効果的です。

于 2013-04-16T08:48:40.773 に答える
1

あなたの問題に対する本当に良い解決策が1つあります。ACL(アクセス制御リスト)です。

役割とリソースがあり、それにアクセスできます:)

Zend サイトの例があります。

$acl = new Zend_Acl();

$acl->addRole(new Zend_Acl_Role('guest'))
    ->addRole(new Zend_Acl_Role('member'))
    ->addRole(new Zend_Acl_Role('admin'));

$parents = array('guest', 'member', 'admin');
$acl->addRole(new Zend_Acl_Role('someUser'), $parents);

$acl->add(new Zend_Acl_Resource('someResource'));

$acl->deny('guest', 'someResource');
$acl->allow('member', 'someResource');

echo $acl->isAllowed('someUser', 'someResource') ? 'allowed' : 'denied';

http://framework.zend.com/manual/1.12/en/zend.acl.introduction.htmlの詳細

何かが書かれていて、それがうまく機能している場合、何か新しいものを書くために時間を無駄にすることは意味がないと教えられています.

これらのロール、リソース、およびそれらの間の関係をデータベースに保持し、必要なときにロードすることができます。

これは非常に基本的な例です。Zend_Acl は非常に強力なツールを提供します。使い方はあなた次第です。Zend クラスを使用したくない場合は、それを見て、同様の方法でクラスを設計できます。

于 2013-04-16T09:13:31.053 に答える