0

rbacシステムについて質問があります。私はそれをかなりよく理解していると思いますが、特別な場合についてもっと情報が必要です。

ユーザーではなくグループで自動起動を行いたいのですが。たとえば、グループ「HR」には人を作成する権限があります。そうすれば、このグループに参加する人なら誰でもそれを持っているでしょう。

もっと情報をあげましょう。

私のデータベースの一部: ここに画像の説明を入力してください

そして、これは私のグループ階層の一部である可能性があります。 ここに画像の説明を入力してください

だから私が探しているのは、これは必須だろう、各グループがいくつかの自動化を持っているシステムです。人々は自分のグループと親グループの自動化を取得します(たとえば、「Forsys」の人々は「Forsys」、「R&D」、「Administration」の自動化を持っています)。

私が現時点で見ている解決策は、bizruleを使用することです。しかし、データベースにphpコードを書くのが良い考えかどうかはわかりません。グループ階層を更新すると(R&Dは管理ではなくRHを継承します)、データベースのbizruleを変更する必要があります。私はそれを試しました、そしてそれはうまくいきます、しかしあなたが見ることができるようにそれはたくさんのコードを必要とします。

$user = User::model()->with("people","people.groups")->findByPk(Yii::app()->user->id);
foreach($user->people[0]->groups as $group)
  if($group->id == 2)
     return true;
return false;

これは、ユーザーがグループに属しているかどうかを確認するためだけのものです(親グループと階層をチェックせずに)

もう1つの可能性は、たとえば次のような新しいテーブル「group_auth」を作成することです。

-Group_2には「managePerson」の役割があります

-Group_3には操作"deleteUser"があります...

そして、ユーザーがグループに追加またはグループから削除されるたびに、auth_assigmentテーブルの自動化を更新します。

この件について他の意見を聞きたいです。すべてのコメントをいただければ幸いです:)

読んでいただきありがとうございます。私を理解するのに苦労した場合は、私の英語をお詫びします。

マイケルS。

4

2 に答える 2

0

ユーザーが独自の認証アイテムを取得することはありますか?そうでない場合は、本質的にauth_assignmentのuserid列を交換して、代わりにgroupIDとして名前を付ける/扱うことができるようです。そうすれば、ユーザー認証の割り当てをグループの役割と同期させることを心配する必要がなくなります。

おそらくいくつかの変更を加える必要がある場所がいくつかあります。-デフォルトでは、CWebUserはログインしたユーザーIDを渡してbizrulesで使用します。代わりにgroupId/groupIdsを渡す独自のオーバーライドを使用して変更することをお勧めします。-CDbAuthManagerをオーバーライドして、そこでの動作の一部をやり直す必要があります

私が取り組んだプロジェクト(マルチテナントRBACカスタム権限を処理していた)で同様のことを行いました。これには、カスタムCDbAuthManagerオーバーライドが必要でした。あなたがそれをするならばそれは少しトリッキーになります、しかしあなたに利用できる非常に多くの力があります。

編集: ユーザーが追加の認証を必要とする場合があることを理解しました。グループに、さまざまなロールがシリアル化された「ロール」フィールドがある場合はどうなりますか(または、そのグループに複数のロールを格納する他の方法も、関係になる可能性があります)。

次に、(効率のために)ユーザーログイン時に、これらのロールをセッションに保存します。おそらく、物事を処理する最も簡単な方法は、WebUserオーバーライドのカスタムcheckAccessを作成することです: https ://github.com/yiisoft/yii/blob/1.1.13/framework/web/auth/CWebUser.php#L801

これにより、カスタムチェックを簡単に実行できるようになります。それから私はおそらく次のようなことをするでしょう:

if(Yii::app()->user->hasGroupAccess() || Yii::app()->user->checkAccess('operation/task/role')) {
    ....
}

WebUserhasGroupAccessメソッドでは、すべてのグループロールをループして、それらをcheckAccessに送信することもできます。

それがうまくいくと思いますか?

于 2013-01-27T22:03:51.940 に答える
0

グループが別のテーブルにある場合、またはアプリケーションの別の場所にある場合にグループのアクセスをチェックするために使用するものは、デフォルトでユーザーにロールを与えます。これを使用して:

return array(
    'components'=>array(
        'authManager'=>array(
            'class'=>'CDbAuthManager',
            'defaultRoles'=>array('authenticated', 'R&D', 'Administration'),
        ),
    ),
);

下: デフォルトの役割の使用

これを使用することで、すべてのユーザーがこれらの割り当てを取得します。次に、が正しい値を返すbusiness ruleことを確認するために を作成します。checkAccess('group')

たとえば、あなたの場合、business ruleforR&Dは次のようになります。

return (
    count(
        Person::model()->findByPk(Yii::app()->user->id)->groups(array('name'=>'R&D'))
    ) > 0
) ? true : false;

したがって、これが行うことは次のとおりです。

  • find the logged-in person by primary key
  • look into groups (from the user) for the group with name R&D
  • if there is a group: return true (else return false)
于 2013-01-31T12:42:57.287 に答える