Компонент CakePHP Auth - проблема с функцией isAuthorized () - PullRequest
0 голосов
/ 08 октября 2011

У меня в контроллере для студентов есть следующая функция isAuthorized ():

function isAuthorized() {
    $studentId = $this->Auth->user('id');
    $studentEmail = $this->Auth->user('email');
    if ($this->Auth->user('active') == 1 && $this->Auth->user('level_complete') != 1) {
        $this->Auth->loginRedirect = '/classrooms/view';
        return true;
    } elseif (!$this->Student->hasPayed($studentId)) {
        $this->Session->write('Payment.student_id', $studentId);
        $this->Session->write('Payment.student_email', $studentEmail);
        $this->Session->write('Payment.examScore', $this->Student->getPlacementScore($studentId));
        $this->Auth->logout();
        $this->redirect(array('controller'=>'payments', 'action'=>'pay'));  
    } elseif ($this->Auth->user('level_complete') == 1) {
        $this->Session->write('Payment.student_id', $studentId);
        $this->Session->write('Payment.student_email', $studentEmail);
        $this->Auth->logout();
        $this->redirect(array('controller' => 'payments', 'action' => 'repay'));
    } else {
        $this->Auth->logout();
        $this->redirect(array('controller' => 'students', 'action' => 'disabled'));
    }


    return false;
}

В основном, этот метод охватывает четыре возможных состояния:

  1. Пользователь активен и не прошел уровень = Авторизован
  2. Пользователь не заплатил = Не авторизован
  3. Пользователь прошел уровень и должен снова заплатить = Не авторизован
  4. Учетная запись пользователя не активна

Проблема, с которой я столкнулся, заключается в том, что в моем заголовке есть форма входа в систему, и я могу войти с любого контроллера. Если я вхожу в систему из контроллера, отличного от Контроллера студентов, метод isAuthorized () не вызывается, и пользователь может войти в систему, даже если он не должен этого делать.

Есть идеи?


Редактировать: После проверки определения API метода isAuthorized () я думаю, что метод вызывается только тогда, когда запрашиваются действия от контроллера студентов. Где еще я мог бы реализовать эту логику тогда? Спасибо

Ответы [ 2 ]

5 голосов
/ 08 октября 2011

Вы все портите.Метод isAuthorized () вызывается только тогда, когда пользователь вошел в систему.

Это означает, что торт разделяет логику на две части:

1) пользователь должен войти в систему, чтобы увидеть доступ к действию.управляется методом $this->Auth->allow() (внутри beforeFilter вашего контроллера).Это говорит торт, если пользователь должен войти в систему, чтобы увидеть действие или нет.

2) Пользователь должен передать метод isAuthorized ().Только если $ this-> Auth-> authorize установлен на «controller».

Итак, если вы хотите, чтобы пользователи получали доступ к действию «X» из контроллера C, в вашем контроллере C вы должныпоместите этот код:

function beforeFilter(){
    $this->Auth->authorize = 'controller';
    $this->Auth->allow('*');
}

После этого, если вы хотите иметь больший контроль над этим (например, если роль пользователя «admin»), то вам нужно сделать это в вашем методе isAuthorized ().

Надеюсь, это поможет.

1 голос
/ 08 октября 2011

Я обычно помещаю такую ​​логику в мой login() метод моего Auth контроллера (т.е. UsersController).

Однако я не верю, что ваше понимание isAuthorized()неверен.К сожалению, я считаю, что подключиться к нему сложнее.

Например:

  • Как отмечает santiagobasulto , вам нужно убедиться, что вынастроен Auth->authorize = 'controller'.
  • Если вы используете любой beforeFilters(), убедитесь, что вы звоните parent::beforeFilter().Возможно, вы забыли об этом в ключевой области, не позволяющей Cake выполнять ваши функции при других действиях при входе в систему.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...