2011-01-12 2 views
1

내가 doctrine.I 모든 부트 스트랩이 제대로 수행되고 난에 로그인 할 수 있습니다 믿습니다 사용하여 프로젝트와 Zend_Auth를 사용하고 있습니다를 받고Doctrine 어댑터를 사용할 때 Zend_Auth/Zend_ACL에서 역할을 얻는 방법은 무엇입니까? . 함께 모든 작업

내 어댑터는 다음과 같습니다

class Abra_Auth_Adapter_Doctrine implements Zend_Auth_Adapter_Interface { 

protected $_resultArray; 
private $username; 
private $password; 

public function __construct($username, $password) { 

    $this->username = $username; 
    $this->password = $password; 

} 

//based on feedbacks as response authenticate has changed to this 
public function authenticate() { 
    $q = Doctrine_Query::create() 
    ->from("Abra_Model_User u") 
    ->leftJoin("u.Role r") 
    ->where("u.username=? AND u.password=?", array($this->username,$this->password)); 
    $result = $q->execute(); 
    if (count($result) == 1) { 
     return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $result->get("Mylibrary_Model_User"), array());//autoloaderNamespaces[] = "Mylibrary_" in application.ini 
    } else { 
     return new Zend_Auth_Result(Zend_Auth_Result::FAILURE, null, array("Authentication Unsuccessful")); 
    } 
} 

내 Abra_Controller_Pluging_Acl의 모습을 이

class Abra_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract { 

public function preDispatch(Zend_Controller_Request_Abstract $request) { 
    parent::preDispatch($request); 
    $controller = $request->getControllerName(); 
    $action = $request->getActionName(); 
    $module = $request->getModuleName(); 

    $auth = Zend_Auth::getInstance(); 
    if($auth->hasIdentity()){ 
     $identity = $auth->getIdentity(); 
     $roles = $identity["Role"]; 
     $role = $roles["name"]; 
     $role = (empty ($role) || is_null($role))? "regular" : $role ; 
    } else { 
     $role = "guest"; 
    } 

} 

처럼 지금 Doctrine_Event 치명적인 오류를 갖는 spl_autoload를() function.spl-자동로드] Doctrine_Event 클래스를로드 할 수 없습니다. 나는이 post here을 봤고 그게 Zend_Session을 사용하는 것에 어떻게 영향을 미칠지 궁금하네요. 이걸 읽으려면 내 php.thanks에서 많이 사용하도록 하는게 사실이에요.

답변

2

역할을 얻는 방법 : 어댑터에서 사용자 이름 필드 만 반환하는 대신 로그인 성공시 전체 사용자 객체를 반환하는 방법은 무엇입니까? 그런 다음 Zend_Auth::getIdentity()으로 전화하면 모든 것을 사용할 수 있습니다.

질문 1 : 컨트롤러를 리소스로 취급하고 ACL 규칙이 모듈마다 다를 경우 리소스 이름도 모듈을 반영해야합니다. 이것은 동일한 컨트롤러 이름을 가진 모듈의 문제를 해결합니다.

질문 2 : 정확하게 이해하고 있는지 잘 모르겠습니다. Zend_Auth와 그 스토리지는 자체 세션 네임 스페이스에서 uer identity를 유지 관리 할 것입니다. 그러나 DB의 사용자 레코드가 변경 될 때 (예를 들어, 로그인 한 세션 중에 사용자가 자신의 프로파일에서 전체 이름을 수정하는 경우) 수행 할 문제에 대해 살펴본 후 해당 사이트의 전체 이름을 사이트 템플릿에 표시하고 있습니다. Zend_Auth::getIdentity()에서 가져 왔습니다. 사용자로서, 나는 변화가 가시적 인 인터페이스에 반영 될 것으로 기대하지만, 변화는 단지 세션에서가 아니라 db에서 일어났다.

내가 과거에 수행 한 작업은 새 사용자 레코드를 가져오고 항상 성공을 반환하는 추가 인증 어댑터를 만드는 것입니다. 사용자가 프로파일을 업데이트하면이 간단한 어댑터를 사용하여 Zend_Auth::authenticate()으로 전화합니다. 세션 저장소가 업데이트되고 모든 것이 세계와 잘 어울립니다.

[이 방법은 거의 확실하게 해킹이므로 대체 접근법을 듣는 데 관심이 있습니다. 나는 세션 저장 장치에 직접 값을 설정할 수 있다고 확신하지만, 마지막으로 시도해 보았을 때 제대로 작동하지 못했습니다. 그래서 추가 어댑터 해결 방법에 의지했습니다.]

+0

이 모든 것을 쓰는 시간 동안 고마워. 내 게시물을 편집하여 질문 2를 더 분명하게 만듭니다. –

+0

안녕하세요 저는 아이디어를 구현할 때 발견 된 결과와 문제로 스크립트를 업데이트했습니다. 다른 사람들이 지금부터 단계적으로 자신의 경험을 공유 할 수 있기를 바랍니다. 어쨌든 –

+0

역할이 배열입니까? 사용자 모델은 hasMany ('Role')로 정의되어 있습니까? 별도의 생각으로 왜 Auth 어댑터가 모든 것을 배열로 변환하려고하는지 알고 싶습니다. Doctrine은 객체 그래프를 생성합니다. 왜 그것을 지키지 않습니까? –

관련 문제