2013-06-30 1 views
1

Я пишу свой собственный компонент Auth для CakePHP 2, который наследуется от BaseAuthenticate. Этот компонент использует внешнюю lib (расположенную в/usr/share/php), которая сохраняет информацию в переменной $ _SESSION. Моя проблема в том, что при смене страницы вся эта информация удаляется из $ _SESSION, поэтому внешняя библиотека не видит, что я уже подключен.CakePHP: сохранение информации в сеансе

Я попытался сохранить содержимое $ _SESSION, добавленное lib, используя $ this-> Session-> write в Auth.MyAuthenticateComponent, но это также удалено.

Благодарим за помощь.

редактировать:

Код:

class AppController extends Controller { 
    public $use = array('User'); 
    public $components = array(
     'Session', 
     'Auth' => array(
      'loginRedirect' => array('controller' => 'Sheets', 'action' => 'index'), 
      'logoutRedirect' => array('controller' => 'Users', 'action' => 'login') 
     ) 
    ); 

    public function beforeFilter() 
    { 
     $this->Auth->authenticate = array('Arise'); 
    } 
} 

class UsersController extends AppController 
{ 
    public $helpers = array('Html', 'Form'); 

    public function beforeFilter() 
    { 
     parent::beforeFilter(); 
     $this->Auth->allow('login'); 
     $this->Auth->authenticate = array('Arise'); 
    } 

    public function login() 
    { 
     if ($this->request->is('post')) { 
      if ($this->Auth->login()) 
       return $this->redirect($this->Auth->redirect()); 
      else 
       $this->Session->setFlash('Error'); 
     } 
    } 

    public function logout() 
    { 
     $this->redirect($this->Auth->logout()); 
    } 
} 

App::uses('BaseAuthenticate', 'Controller/Component/Auth'); 
require_once('/usr/share/php/openid/consumer/consumer.php'); 

class AriseAuthenticate extends BaseAuthenticate 
{ 
    protected function _ariseAuthenticate($openid_url) 
    { 
     $consumer =& AriseOpenID::getInstance(); 
     $required = array(
      'http://somewhere/types/identifiant', 
      'http://axschema.org/namePerson/first', 
      'http://axschema.org/namePerson/friendly' 
     ); 

     $consumer->setReturnTo('http://mysite/users/login'); 
     $consumer->setTrustRoot('http://mysite/users/login'); 
     $consumer->authenticate($openid_url, $required); 

     if ($consumer->isLogged()) { 
      $first_name = $consumer->getSingle('http://axschema.org/namePerson/first'); 
      $nick = $consumer->getSingle('http://axschema.org/namePerson/friendly'); 
      $id_arise = $consumer->getSingle('http://openid.iiens.net/types/identifiant'); 

      return array(
       'id_arise' => $id_arise, 
       'first_name' => $first_name, 
       'nick' => $nick 
      ); 
     } 

     return false; 
    } 

    public function checkUser($result) 
    { 
     $User = ClassRegistry::init('User'); 
     $result = $User->find('first', array(
      'conditions' => array(
       'id_arise' => $result['id_arise'] 
      ) 
     )); 

     if (!$result) { 
      $User->create(); 
      $User->save(array(
       'id_arise' => $result['id_arise'], 
       'first_name' => $result['first_name'], 
       'nick' => $result['nick'] 
      )); 

      $result = $User->find('first', array(
       'conditions' => array(
        'id_arise' => $result['id_arise'] 
       ) 
      )); 
     } 

     $user = $result['User']; 
     unset($result['User']); 

     return array_merge($user, $result); 
    } 

    public function authenticate(CakeRequest $request, CakeResponse $response)   
    { 
     if (!$request->is('post')) 
      return false; 

     $openid_url = (array_key_exists('login', $request->data)) 
      ? $request->data['login']['openid_url'] 
      : NULL; 

     $openid_url = ($openid_url == '') ? NULL : $openid_url; 

     if ($result = $this->_ariseAuthenticate($openid_url)) 
      return $this->checkUser($result); 

     return false; 
    } 

    public function getUser() 
    { 
     if ($result = $this->_ariseAuthenticate(NULL)) 
      return $this->checkUser($result); 

     return false; 
    } 
} 
+0

Есть ли 'session_start()' где-то в вашем коде? – chrislondon

+0

Да, внешняя библиотека пытается получить идентификатор сеанса с session_id(), и если это значение пуст, оно выполняет session_start() (это никогда не бывает). – erdnaxeli

+0

Показать код и что такое внешняя библиотека? – burzum

ответ

0

Вы модульное тестирование адаптера аутентификации? Трудно сказать, что не так, но я более или менее уверен, что authenticate() не возвращает массив, но всегда false? Потому что, если authenticate() возвращает действительные пользовательские данные, он будет записан на сеанс.

См. http://api.cakephp.org/2.3/source-class-AuthComponent.html#543, который вызывает http://api.cakephp.org/2.3/source-class-AuthComponent.html#690, который вызывает все настроенные адаптеры auth. Если ваш адаптер возвращает массив пользователей, он должен работать. Поэтому я предполагаю, что ваш адаптер не сможет вернуть массив.