Я создаю приложение cakePHP, где учащиеся могут просто управлять своими собственными данными (например, профилем).Моя идея запретить доступ другим студентам к действию «просмотр» заключается в следующем: (Students_controller.php)
function view($id = null) {
//We check the permissions so a student cannot browse other student's pages
$studentid=$this->Student->field('id',array('user_id'=>$this->Session->read('Auth.User.id')));
if (!$id) {
$this->Session->setFlash(__('Invalid student', true));
$this->redirect(array('action' => 'add'));
}
if ($this->Auth->user('id') <> ($this->data['Student']['user_id'])){
$this->Session->setFlash(__('You are not authorized to access this page,not allowed', true));
$this->redirect(array('controller' => 'users','action' => 'logout'));
}
$this->set('student', $this->Student->read(null, $id));
}
Проблема возникает (я думаю), потому что в моем действии входа в систему у меня есть этот код: (users_controller.php)
function login() {
$studentid= $this->User->Student->field('id',array('user_id'=>$this->Session->read('Auth.User.id')));
$studentformactivated=$this->User->Student->field('form_activated',array('user_id'=>$this->Session->read('Auth.User.id')));
if ($this->Session->read('Auth.User') ) {
if($this->Session->read('Auth.User.group_id') == '1')
$this->redirect(array('controller'=>'specializations', 'action' => 'index'));
else if ($this->Session->read('Auth.User.group_id') == '2')
$this->redirect(array('controller'=>'specializations', 'action' => 'index'));
else if ($this->Session->read('Auth.User.group_id') == '3')
if ($studentformactivated == '1')
$this->redirect(array('controller'=>'students', 'action' => 'view',$studentid));
else
$this->redirect(array('controller'=>'students', 'action' => 'add'));
$this->Session->setFlash('You are logged in!');
$this->redirect('/', null, false);
}
}
Таким образом, каждый раз, когда студент входит в систему, перенаправляется на действие «просмотр» (если было выполнено действие «добавить»), а в действии просмотра мы получаем информацию изсеанс, и кажется, что при выполнении действия входа в систему мы не можем получить эту информацию (журнал sql сообщает, что SELECT Student
. id
ОТ students
AS Student
ГДЕ user_id
НЕДЕЙСТВИТЕЛЬНО ПРЕДЕЛ 1, поэтому он не получает user_id).
Теперь вопросы:
Прежде всего, я хотел бы знать, что вы думаете об этом способе управления контролем разрешений, потому что это первыйкогда я делаю это, и, возможно, есть другие более простые способы сделать это.
Правильно ли я полагаю, что не могу получить информацию из сеанса пользователя сразу после действия входа в систему?
Будет ли этохорошее решение сделать в функции вида что-то вроде:
if (user_is_logged_in){
if ($this->Auth->user('id') <> ($this->data['Student']['user_id'])){
$this->Session->setFlash(__('You are not authorized to access this page,not allowed', true));
$this->redirect(array('controller' => 'users','action' => 'logout'));
}
}
Это единственное, что я вижу, чтобы решить это.Но я попытался с ($ this-> Session-> check ('Auth.User')) для условия (user_is_logged_in), и это не сработало ... Заранее спасибо!ALF.----------------------------------------- EDIT ------------------------------ После обсуждения этого решения, похоже, добавляется код в контроллер приложений перед фильтром.Это все еще не перенаправляет хорошо, возможно это из-за переданных аргументов?У меня кончились идеи ...
function beforeFilter($id = null) {
//Configure AuthComponent
$this->Auth->authorize = 'actions';
$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
$this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
$this->Auth->loginRedirect = array('controller' => 'students', 'action' => 'add');
$this->Auth->actionPath = 'controllers/';
$this->Auth->allowedActions = array('display');
if( $this->Auth->User('id') != $id ) // bad, redirect them to safe page
$this->redirect(array('controller' => 'users','action' => 'logout'));
}