2011-09-08 2 views
0

사용자가 Zend_Auth_Adapter_Ldap을 사용하여 인증되고 세션에 저장되는 Zend_Acl 및 Zend_Auth 체계를 설정했습니다. 나는 컨트롤러 플러그인을 사용하여 $auth->hasIdentity()$acl->isAllowed()이 필요한 경우 로그인 양식을 표시하는지 확인합니다.Zend_Auth 체인 어댑터 및 소유권 역할 acl

내가하고 싶은 일은 Zend_Auth의 세션 확인 외에 로그인 쿠키 (내 구현은 best practices)와 API 키를 추가하는 것입니다. 또한 사용자가 만든 콘텐츠에서 역할을 '소유자'로 전환해야합니다.

내 문제 : 일반 세션 인증이 실패 할 경우

  • 로그인 쿠키는 대체 표기하고, 따라서 세션이
  • API 키를 인증해야한다는 대체 경우 로그인 쿠키 모두 세션 표기 쿠키가 실패합니다.
  • 비밀번호를 어느 곳에 나 저장하고 싶지 않습니다. LDAP에만 있어야합니다.
  • 전체 사용자 이름과 비밀번호가 없으면 LDAP에서 찾을 수 없기 때문에 ID의 영구 저장이 필요합니다.
  • 역할은 모두 (지속적으로 저장해야합니다) LDAP 그룹 구성원에 의존하고 ID가 컨텐츠의 소유자가 고려되어야하는 경우를 무엇

(관리되지 아니하는 한,이 요청 사이에서 변화하고 의미) 젠드 프레임 워크 MVC와 Zend_Auth + Zend_Acl을 사용하여 이것을 해결하는 좋은 패턴/접근법?

답변

0

당신은 당신이 또는 저장소 (LDAP 등) 원래 어댑터를 다시 사용할 수 있습니다, 이러한 클래스에서 Zend_Auth_Adpater_Interface 및 Zend_Auth_Storage_Interface

를 구현하는, 자신의 어댑터/저장 클래스를 생성하고 만 인증을 구현하는 코드를 작성할 수 있습니다 규칙. Zend_Auth_Adapter에 대한 여러 소스를 사용하여 예를 들어

는 :

<?php 
class My_Auth_Adapter implements Zend_Auth_Adapter_Interface 
{ 
    private $ldapAdapter; 
    private $cookieAdapter; 
    private $apiKeyAdapter; 

    public function __construct($ldapAdapter, $cookieAdapter, $apiKeyAdapter) { 
    { 
     $this->ldapAdapter = $ldapAdapter; 
     $this->cookieAdapter = $cookieAdapter; 
     $this->apyKeyAdapter = $apiKeyAdapter; 
    } 
    public function authenticate() 
    { 
     if ($this->ldapAdapter->authenticate()) { 
      //return the Zend_Auth_Restult 
     } elseif ($this->cookieAdapter->authenticate() { 
      //return the result 
     } elseif ($this->apiKeyAdapter->authenticate() { 
      //return the result 
     } else { 
      //Create and return a Zend_Auth_Result which prevents logging in 
      } 
    } 
} 

나는 당신의 로그인 규칙을 이해 확실하지 오전하지만 개념은 스토리지 클래스에 대한 동일하게 유지 :

<?php 
class My_Auth_Storage implements Zend_Auth_Storage_Interface 
    private $sessionStorage; 
    private $cookieStorage; 
    private $apiStorage; 

    public function read() 
    { 
     if (!$this->sessionStorage->isEmpty()) 
     { 
      return $this->sessionStorage->read(); 
     } elseif (!$this->cookieStorage->isEmpty()) 
     { 
      return $this->cookieStorage->read(); 
     } //And so one, do not forget to implement all the interface's methods 

으로 이 구현을 사용하면 여러 자격 증명 소스와 여러 세션 저장 엔진 (쿠키, 세션, db 또는 사용하려는 모든 것)을 가질 수 있습니다.

acl 문제 때문에 컨트롤러 플러그인에서 LDAP 그룹을 가져 와서 인증 후에 필요에 따라 저장할 수 있습니다. 그런 다음 각 요청에서 ACL을 검사하는 두 번째 플러그인을 사용할 수 있습니다.