1

私のプロジェクト要件は次のようなものです:

一番上には、すべての d アクセス権を持つ管理者がいて、最初のレベルです。

管理者の下には、部門長の作成とは別に、すべての d アクセス権を持つ部門長がいます。

部門長の下には、割り当てられた部門ごとのデータを管理するその他のメンバーがいます。

これで、すべての異なる部門長は独自の情報とメンバーを持ち、すべての部門長/メンバーは、入力/管理している独自の特定のレコードにアクセスできます。

現在、CakePHP の ACL コンポーネントを使用して、役割とアクセス レベルを分割できますが、すべての部門長は同じレベルのアクセス権を持つため、他の部門長の情報を見ることができ、他のすべてのメンバーは他のメンバーの情報を diff で見ることができます。部門、現在、同じレベルのアクセス権があります。

私のプロジェクトの複雑さは、他のプロジェクトと同じレベル/役割が割り当てられているにもかかわらず、割り当てられた、または作成された情報/データのみを表示する必要があることです。

CakePHP で既に利用可能なプラグインを使用してこれらすべてを管理するために、誰でも最適なオプションを提案できますか。

デフォルトの ACL コンポーネントをカスタマイズして作業できますが、予想よりも時間がかかります。

より良いアイデア/提案をいただければ幸いです!

4

1 に答える 1

2

私の見方では、ACL は魔法のようなものではありません。例: ACL は、製品を追加/編集/削除するアクセス権を持つユーザーを通知するアクセス許可を管理できます..しかし、クエリを変更して、定義されたアクセス許可に従って製品をフィルタリングすることはできません (「部門 A のユーザーは、部門 A の製品を参照してください」..実際にはそれは嘘です。ACL はそれを管理できますが、製品を追加するたびに ACO を作成し、AROS_ACOS テーブルに権限を設定する必要があるため、実用的ではない可能性があります。また、AROS はツリー構造であるため、データのクエリを計画している場合、簡単に悪夢になる可能性があります。

グループのみの ACLを使用して、特定のページ/アクションへのアクセスを制御し、次のようなルールを作成します。

  • 「部門長は、ページ「製品リスト」にアクセスして、製品を追加/削除/変更できます」
  • 「管理者はすべてのページにアクセスできます」
  • 「他のユーザーは「製品リスト」にアクセスでき、製品を追加できますが、削除することはできません」

接続しているユーザーに応じてクエリを調整するので、「製品リスト」ページのコントローラーで次のようにします。

  • 接続されたユーザーが部門長に属している場合は、すべての製品を選択します。product.department_id=connected_user.department_id
  • 接続ユーザーが管理者の場合は、すべての製品を選択します

クエリが多すぎて、何千もの if 文を実行したくない場合は、コンポーネントや動作を作成するfind()app_model . アイデアは、すべてのクエリをキャッチし、クエリで使用されているモデルの 1 つに「department_id」というフィールドがあるかどうかを確認し、ある場合はmodel.department_id=connected_user.department_id条件をクエリに追加することです。

複数の言語で表示できる 1 つの Web サイトに対してこれを行いました。各言語には独自のユーザー、データ、ログなどがあり、すべての情報を表示できる管理者が 1 人います。

幸運を!

編集済み: 私が使用する動作は次のとおりです。

<?php 
class LocalizableBehavior extends ModelBehavior { 

    /** 
     * Filter query conditions with the correct `type' field condition. 
     */ 
    function beforeFind(&$model, $query) 
    {
        /**
         * Condition for the paginators that uses joins
        */
        if(isset($query['joins']) && !empty($query['joins'])){
            foreach($query['joins'] as $key => $joinTable){
                if(ClassRegistry::init($joinTable['alias'])->hasField('lang')){
                    $query['joins'][$key]['conditions'][] = $joinTable['alias'].".lang = '".$_SESSION['lang']."'";
                }
            }
        }

        /**
         * condition for the normal find queries
        */
        if($model->hasField('lang') && $model->name != "User"){
                $query['conditions'][$model->name.'.lang'] = $_SESSION['lang'];
        }
        return $query;
    }

} 
?>

クエリを変更して、現在の言語 ($_SESSION['lang']) に一致する条件を追加します。コントローラーでは、LocalizableBehavior をアタッチし、いつものように find メソッドを使用するだけです。

$this->Products->find('all');
于 2011-06-16T13:09:42.797 に答える