2011-01-20 4 views
0

Я создаю приложение 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')); 
} 

ответ

1

Предполагая, что профиль является моделью Студента, почему бы вам просто не сделать это?

class StudentsController extends Model { 
function view($id = null) { 
    if($this->Auth->User('id') != $id) // bad, redirect them to safe page 
    $this->redirect('/badaccess/denied'); 
} 
} 

Поскольку $ id является идентификатором профиля студента, просто проверьте его на идентификаторе зарегистрированного пользователя.

+0

Здравствуйте! Прошу прощения за ответ. Я пробовал это, но кажется, что он не работает со страницы входа, потому что он не получает информацию о сеансе (я думаю, SQL-журнал говорит SELECT Student.id FROM students AS Student WHERE user_id IS NULL LIMIT 1, так что это не получая user_id). Как и код, который я опубликовал. После того, как вы вошли в систему, все будет хорошо, проблема во время входа в систему, потому что я перенаправляюсь на страницу просмотра. Спасибо за ответ – alfizqu

+0

Похоже, у вас есть несоответствие в ваших именах. Знает ли Cake, что вы используете таблицу Student в качестве своей таблицы входа? Вы на 100000% уверены, что все последовательно называет все? Когда вы отправляете данные в функцию входа в систему, проверьте имена и значения, чтобы проверить их соответствие. –

+0

На самом деле, я использую таблицу пользователей для входа в систему, но также и таблицу студентов, чтобы проверить, заполнил ли какой-нибудь пользователь уже некоторые данные. Итак, я использую обе таблицы для входа в систему. Должен ли я сказать торт, я это делаю? – alfizqu

1

не уверен, что это поможет, но я в настоящее время работаю над системой, которая требует дополнительной информации, доступной при входе в систему. в моем случае это было из той же таблицы пользователей (только дополнительные поля), но может работать с другими таблицами/моделями. я бы предположил, что вам нужно будет положить var $uses = array('User, 'Student'); наверху, чтобы сделать это.

в контроллере пользователей я следующее:

function login(){ 
    ... 
     $this->Session->write('Auth.User.type', $this->User->field('type')); 
     $this->Session->write('Auth.User.isapproved', 
      $this->User->field('isapproved')); 
    ... 
} 

, очевидно, вы должны изменить их на что-то вроде

$this->Session->write('Auth.User.student_id', 
    $this->User->Student->field('id',array('user_id'=>$this->User->field('id'))); 

или что-то вдоль этих линий

то должен иметь доступ к нему по адресу if($this->Auth->User('student_id') != $id), аналогично приведенному выше ответу.

не уверен, что это будет работать или нет, поскольку я в настоящее время ищу предложения по моей собственной проблеме, когда я наткнулся на это, поэтому у меня нет времени, чтобы попытаться выяснить, правильно ли я сделал это :)

Смежные вопросы