Я создаю приложение 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
FROM students
AS Student
WHERE user_id
IS NULL LIMIT 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 ----- -------------------------- После обсуждения это решение, похоже, добавляет код в AppController beforeFilter. Это не перенаправляет все еще, может быть, это из-за переданных аргументов? У меня кончились идеи ...
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'));
}
Здравствуйте! Прошу прощения за ответ. Я пробовал это, но кажется, что он не работает со страницы входа, потому что он не получает информацию о сеансе (я думаю, SQL-журнал говорит SELECT Student.id FROM students AS Student WHERE user_id IS NULL LIMIT 1, так что это не получая user_id). Как и код, который я опубликовал. После того, как вы вошли в систему, все будет хорошо, проблема во время входа в систему, потому что я перенаправляюсь на страницу просмотра. Спасибо за ответ – alfizqu
Похоже, у вас есть несоответствие в ваших именах. Знает ли Cake, что вы используете таблицу Student в качестве своей таблицы входа? Вы на 100000% уверены, что все последовательно называет все? Когда вы отправляете данные в функцию входа в систему, проверьте имена и значения, чтобы проверить их соответствие. –
На самом деле, я использую таблицу пользователей для входа в систему, но также и таблицу студентов, чтобы проверить, заполнил ли какой-нибудь пользователь уже некоторые данные. Итак, я использую обе таблицы для входа в систему. Должен ли я сказать торт, я это делаю? – alfizqu