2013-06-30 2 views
1

BaseAuthenticate에서 상속받은 CakePHP 2 용 자체 Auth 구성 요소를 작성하고 있습니다. 이 구성 요소는 $ _SESSION 변수에 정보를 저장하는 외부 lib (/ usr/share/php에 있음)를 사용합니다. 제 문제는 제가 페이지를 바꿀 때이 모든 정보가 $ _SESSION에서 제거 되었기 때문에 외부 lib가 제가 이미 연결되어 있다는 것을 알지 못합니다.CakePHP : 세션에 정보 저장

Auth.MyAuthenticateComponent에서 $ this-> Session-> write를 사용하여 lib에 의해 추가 된 $ _SESSION의 내용을 저장하려고했지만 이것도 제거되었습니다.

도움 주셔서 감사합니다.

편집 :

코드 :

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

예, 외부 lib는 session_id()로 세션 ID를 얻으려고 시도합니다.이 값이 비어 있으면 session_start()가 실행됩니다 (절대 그렇지 않습니다). – erdnaxeli

+0

코드 표시 및 외부 lib 무엇입니까? – burzum

답변

0

당신이 단위 당신의 인증 어댑터를 테스트? 무엇이 잘못되었는지를 말하기는 어렵지만, 나는 authenticate()가 배열을 반환하지는 않지만 항상 틀린가? authenticate()가 유효한 사용자 데이터를 반환하면 세션에 기록됩니다.

구성된 모든 인증 된 어댑터를 호출하는 http://api.cakephp.org/2.3/source-class-AuthComponent.html#690을 호출하는 http://api.cakephp.org/2.3/source-class-AuthComponent.html#543을 참조하십시오. 어댑터가 사용자 배열을 반환하면 제대로 작동합니다. 그래서 귀하의 어댑터가 배열을 반환하지 못한다고 가정합니다.