Веб-сервис CakePHP REST и аутентификация, как обрабатывать

#php #cakephp #cakephp-1.3

#php #cakephp #cakephp-1.3

Вопрос:

Я следовал руководству по аутентификации в CAKEPHPhttp://www.google.com/url?sa=Damp;q=http://book.cakephp.org/view/1250/Authentication

И я следовал руководству о том, как настроить веб-сервис REST:http://book.cakephp.org/view/1239/The-Simple-Setup

Это именно мой app_controller:

 class AppController extends Controller {
    var $components = array('DebugKit.Toolbar', 'Session', 'Auth');
    var $helpers = array('Html','Javascript', 'Session', 'Ajax', 'Facebook.Facebook');

    function beforeFilter()
    {
        // importa modello Season
        $this->Season = ClassRegistry::init('Season');

        // ricava la variabile di sessione
        $id = $this->Session->read('editable_season_id');

        // verifica se tale id è esistente
        $exist = $this->Season->exist($id);

        // se non esiste o è un valore non valido o è nullo
        if((is_null($id)) || (!is_numeric($id) || (!$exist)))
        {    
            // cerca l'id della stagione più recente
            $id = $this->Season->getLastSeasonId();

            // se esiste assegnalo ad una var di sessione
            if($id)
            {
                $this->Session->write("editable_season_id", $id);
                $title = $this->Season->getSeasonName($id);
                $this->Session->write("editable_season_title", $title);
                $this->redirect($this->referer());
            } else { // altrimenti lancia errore
                $seasons = $this->Season->getSeasons();
                $this->cakeError('defaultSesonNotFound', array('seasons' => $seasons));
            }       
        }
     }
}
  

Теперь в каждом контроллере я перезаписываю функцию beforeFilter и разрешаю некоторые действия. Например, я хочу поделиться своим REST со всеми, поэтому в моем контроллере:

 function beforeFilter()    {
   parent::beforeFilter();
   $this->Auth->allow('showMatchesBySeasonId', 'matchDetails', 'view');
}
  

где view — это имя моего сервиса REST.
При первом вызове функции ПРОСМОТРА я буду перенаправлен на действие входа в систему. Если я снова вызову VIEW, он будет выполнен без проблем, и информация будет показана, и проблем не будет, пока файл cookie с именем «CAKEPHP» не будет сохранен на моем компьютере (если я очищу кэш памяти, возникнет та же проблема). Почему? Как я могу избежать такого поведения?

С уважением!

Ответ №1:

Я заметил, что подобные проблемы возникают с компонентом сеанса. Попробуйте вместо этого использовать cookie.

 class AppController extends Controller {
    var $components = array('DebugKit.Toolbar', 'Cookie', 'Auth');
    var $helpers = array('Html','Javascript', 'Ajax', 'Facebook.Facebook');

    function beforeFilter()
    {
        // importa modello Season
        $this->Season = ClassRegistry::init('Season');

        // ricava la variabile di sessione
        $id = $this->Cookie->read('editable_season_id');

        // verifica se tale id è esistente
        $exist = $this->Season->exist($id);

        // se non esiste o è un valore non valido o è nullo
        if((is_null($id)) || (!is_numeric($id) || (!$exist)))
        {    
            // cerca l'id della stagione più recente
            $id = $this->Season->getLastSeasonId();

            // se esiste assegnalo ad una var di sessione
            if($id)
            {
                $this->Cookie->write("Season.editable_id", $id);
                $title = $this->Season->getSeasonName($id);
                $this->Cookie->write("Season.editable_title", $title);
                $this->redirect($this->referer());
            } else { // altrimenti lancia errore
                $seasons = $this->Season->getSeasons();
                $this->cakeError('defaultSesonNotFound', array('seasons' => $seasons));
            }       
        }
     }
}
  

Кроме того, вы заметите, что я установил для вашего ключа Cookie-> write() значение «Season.editable_id». Вы можете использовать sesssion / cookie в виде многомерного массива, используя «.» . Я считаю, что это лучшая практика, чтобы вы не перезаписывали пары ключ / значение.