2

レコードを表示しているログインしているユーザーに基づいてレコードを制限したい。

たとえば、次の 2 つのモデルがあります。

Assignments
Users

したがって、学生 (ユーザー) が課題の概要を表示している場合、彼は自分の課題のみを表示し、自分の課題のみを表示/削除/編集できる必要があります。

ただし、教師 (ユーザー) が課題の概要を表示している場合、すべての課題が表示され、すべての課題に対して追加/編集/削除を実行できます。

グループ条件を検索に入れ、次に表示/編集/削除アクションのコードにも適切に入れることで、これを行うことができることを私はすでに知っています。

私の質問は - cakephp でこのようなシナリオを処理する最良の方法は何ですか? どこにでも条件を設定することは、私には良い方法とは思えません。

4

2 に答える 2

3

解決すべき 2 つの別個の問題として考える

アクセス制御

1 つ目は、たとえば URL を操作して自分が所有していないものを表示/編集/削除しようとする学生を拒否する方法です。その使用 isAuthorized については、本に例があり、質問の情報に合わせて次のようになります。

// app/Controller/AppController.php

public $components = array(
    'Session',
    'Auth' => array(
        'authorize' => array('Controller') // Added this line
    )
);

public function isAuthorized($user) {
    // Teachers can access/do everything - adapt to whatever identifies a teacher
    if ($user['is_teacher'])) {
        return true;
    }

    // Anyone logged in can access the index
    if ($this->action === 'index') { 
        return true;
    } 

    // The owner of a whatever can view, edit and delete it
    $id = $this->request->params['pass'][0];
    $owner = $this->{$this->modelClass}->field('user_id', array('id' => $id));
    if ($owner === $user['id'])) {
        return true;
    }

    // Default deny
    return false;
}

生徒のデータを制限する

2.1 以降で使用できるイベント システムは、前述のデータ制限を適用する簡単な方法です。繰り返しになりますが、質問の情報に合わせて本に関連する例があります。それは次のようになります。

// app/Controller/AssignmentsController.php

public function beforeFilter() {
    if (!$this->Auth->user('is_teacher')) {
        $currentUser = $this->Auth->user('id');
        $this->Assignment->getEventManager()->attach(
            function(CakeEvent $e) use ($currentUser) {
                $e->data[0]['conditions']['user_id'] = $currentUser;
                return $e->data[0];
            },
            'Model.beforeFind'
        );
    }
}

これにより、すべての検索結果に条件が追加されるuser_idため、インデックス リストには自分の課題のみが表示されますが、教師の場合はすべての課題が表示されます。

于 2013-07-24T21:48:34.563 に答える
1

StudentAssignments と TeacherAssignments という 2 つの別個のモデルを作成します。どちらのモデルも Assignments モデルを拡張できます。その後、各モデルの beforeFind で条件をフィルタリングできます。このようにして、モデルを分離し、それらを適切に操作できます。

例:

App::uses('Assignment', 'Model');

class StudentAssignments extends Assignment
{
    function beforeFind( $queryData ) {
        $queryData['conditions'] = array_merge( (array)$queryData['conditions'], 
                                    array( $this->alias.'.user_id' => CakeSession::read('User.id') ) );
        return parent::beforeFind($queryData);
    }

}

次に$this->StudentAssignments->find('all');、単一のユーザーのすべての割り当てを呼び出すために呼び出すことができます

于 2013-07-24T20:45:52.530 に答える