解決すべき 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
ため、インデックス リストには自分の課題のみが表示されますが、教師の場合はすべての課題が表示されます。