2009-09-17 4 views
5

이것은 매우 간단합니다. 나는Zend_Auth 스토리지는 어떻게 작동합니까?

$auth->getStorage()->write($user); 

쓰기 그리고 내가 원하는이 $ 사용자를로드하는 별도의 프로세스에서,하지만 난

$user = $auth->getIdentity(); 

이 비어 있지 때문에 수. 내가 그걸 ... 셋업하지 않았 니? 왜 작동하지 않습니까? 할프?

[편집 2011-04-13]

이 거의 2 년 전에 요구되고있다. 사실, 나는 2010 년 7 월에이 질문을 반복했고, 내가 그 당시에는 이해하지 못했던 환상적인 대답을 얻었다.

링크 : 난 이후 나는 Zend_Auth와 같은 스토리지 엔진을 사용하지만, 모든 나쁜 우회 내 모든 프로젝트에 (때로는 별도의 조정과)를 사용하여 아주 좋은 litte 클래스를 구축 Zend_Auth fails to write to storage

.

<?php 

class Qapacity_Helpers_Storage { 

    public function save($name = 'default', $data) { 

     $session = new Zend_Session_Namespace($name); 
     $session->data = $data; 

     return true; 
    } 

    public function load($name = 'default', $part = null) { 

     $session = new Zend_Session_Namespace($name); 

     if (!isset($session->data)) 
      return null; 

     $data = $session->data; 

     if ($part && isset($data[$part])) 
      return $data[$part]; 

     return $data; 
    } 

    public function clear($name = 'default') { 

     $session = new Zend_Session_Namespace($name); 

     if (isset($session->data)) 
      unset($session->data); 

     return true; 
    } 

} 

?> 
+0

다른 문제는 저장소 (및 Zend_Auth)가 동일한 구성을 갖고 있지 않을 수 있다는 것입니다. 한 곳에서 쓰기, 다른 곳에서 읽기. – AsTeR

답변

1

정상 작동합니다.

다음은 Auth getIdentity 함수의 구현입니다.

/** 
* Returns the identity from storage or null if no identity is available 
* 
* @return mixed|null 
*/ 
public function getIdentity() 
{ 
    $storage = $this->getStorage(); 

    if ($storage->isEmpty()) { 
     return null; 
    } 

    return $storage->read(); 
} 

여기에 PHP 세션 저장 쓰기의 구현입니다 및 읽기 기능 : 당신은 Zend_Auth 클래스의 동일한 인스턴스를로드하고 있는지

/** 
* Defined by Zend_Auth_Storage_Interface 
* 
* @return mixed 
*/ 
public function read() 
{ 
    return $this->_session->{$this->_member}; 
} 

/** 
* Defined by Zend_Auth_Storage_Interface 
* 
* @param mixed $contents 
* @return void 
*/ 
public function write($contents) 
{ 
    $this->_session->{$this->_member} = $contents; 
} 

있습니까?

당신은 아마 당신이 getIdentity 방법 후 write 메소드를 호출

$auth = Zend_Auth::getInstance(); 

를 사용하고 있습니까?

어쨌든, 전에 말했듯이, 당신이하고있는 일은 효과가 있습니다.

+0

글쎄, 나는 이걸로 모든 종류의 실험을 한 것 같아. 내가 가진 건 정신적 타박상 뿐이야. 기본적으로, 나는 그 책을 수정 한 다음, 다시 쓰고 그 다음 임의의 일관된 결론에 도달하지 않고 추상적 인 무작위 실험을했습니다. 스토리지를 업데이트 할 때 작동했지만 사용자가 동일한 페이지에 착륙 한 경우에만 작동했으며 다음 번 새로 고침 할 수있었습니다. 내가 리다이렉트했다면 다른 클래스를로드하고 저장 장치를 업데이트 한 클래스에 있지 않으면 작동하지 않을 것입니다. 제 결론은이 쓰레기가 절대적으로 무작위 적이라는 것입니다. 그래도 고마워. – John

+0

설정을 확인하기 만하면 스토리지가 직접 작동합니다. 이 방법을 사용하면 연결이 끊어 졌을 때 ID를 강제로 디버그 모드로 전환하여 공개 ID 로그인 페이지로 로그인 할 수 있습니다. 나는이 문제가 세션의 문제라고 생각한다. – Jai

0

따라서 페이지를 다시로드 할 때 리디렉션하는 동안 세션을 가져올 수 있습니까? 다른 도메인 이름으로 리디렉션하고 있습니까? 그런 다음 쿠키에 문제가있을 수 있으므로 수동으로 session.cookie_domain ini 변수를 설정해야합니다.

쿠키가 PHPSESSID으로 올바르게 설정되었는지 확인하고 모든 페이지 요청시 서버로 보내지는지 확인하십시오. 일정합니까 아니면 모든 요청에 ​​따라 변경됩니까?

또한 세션 데이터가 디스크에 제대로 저장되고 있는지 확인할 수도 있습니다. 세션은 ini 변수 session.save_path에 의해 정의 된 디렉토리에서 찾을 수 있습니다. 파일이 여기에 PHPSESSID에 해당하며 의미있는 항목이 포함되어 있습니까?

register_shutdown_function('session_write_close'); 

색인 : 내 경우는

[email protected]:~# less /var/lib/php5/sess_081fee38856c59a563cc320899f6021f 
foo_auth|a:1:{s:7:"storage";a:1:{s:9:"user_id";s:2:"77";}} 
+0

Nono, 도메인이 동일합니다. 나는 쿠키를 체크 아웃 할 것이다. 이 무렵 나는 지구 온난화, ㅎ를 포함하여 거의 모든 것이 될 수 있다고 확신합니다. – John

0

추가 포함되어 있습니다.PHP 이전 :

$application->bootstrap()->run(); 
+0

이것은 도움이되지 않았습니다. –