Обрабатывать разрешения от действия входа в систему с помощью сеанса - PullRequest
0 голосов
/ 20 января 2011

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

Ответы [ 2 ]

1 голос
/ 17 марта 2011

не уверен, поможет ли это, но в настоящее время я работаю в системе, для которой требуется дополнительная информация при входе в систему. в моем случае он был из той же таблицы пользователей (только дополнительные поля), но может работать с другими таблицами / моделями. я бы предположил, что вам придется поставить 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 ), аналогично ответу выше.

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

1 голос
/ 20 января 2011

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

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 является идентификатором профиля учащегося, просто сравните его с идентификатором вошедшего в систему пользователя.

...