2011-03-12 2 views
2

상황이 있습니다 : 구조적 데이터 (예 : 배열 또는 객체 또는 문자열)를 Zend_Auth ID로 저장합니다. 버전간에 버전의 신원이 변경 될 수 있으므로 한 버전의 신원이 다른 버전의 애플리케이션 코드와 호환 될 수 있습니다.Zend_Auth identity versioning

저장된 신원 데이터가 현재 버전 요구 사항을 준수하는지 확인하는 기능이 필요합니다.

내가 수동에서 보듯이

은 신원이 있는지 여부의 검증과 같이 수행됩니다

$auth = Zend_Auth::getInstance(); 
if ($auth->hasIdentity()) { 
    // Identity exists; get it 
    $identity = $auth->getIdentity(); 
} 

그러나 hasIdentity() 방법에 후크 할 능력이 없다거나 다른 곳 유효성 검사를 수행 할 수 있습니다.

내가 할 수있는 유일한 방법은 구현으로 다른 저장소를 사용하고 저장된 데이터의 유효성 검사를 수행 할 내 Zend_Auth_Storage_Interface 클래스를 구현하는 것입니다.

더 이상 적절한 해결책이 있습니까?

답변

2

나는 완전히 이해할 수는 없지만 인증과 인증의 차이점을 오해 한 것 같습니다.

Zend_Auth는 인증에 관한 내용이므로 이 아닙니다.은 Zend_Auth를 사용하여 권한 부여를 처리하지만 Zend_Acl은 처리해야합니다.

그러나 원하는 경우 인증 프로세스 (예 : 데이터베이스 인증)의 추가 정보는 getResultRowObject($returnColumns, $ommitColumns); 메서드를 사용할 수 있습니다.

"행 개체"를 얻으려면 현재 어댑터에 따라 여러 가지 구현이 있습니다.

Zend_Auth_Storage_Interface은 결과를 저장하는 것이므로 세션이나 데이터베이스에 ID 개체를 저장하는 것과 관련하여 구현하지 않아도됩니다. 당신은 할 수 있습니다 무엇

는하는 자원 (버전 에드 응용 프로그램) (는 사용자 될 수 있습니다) Zend_Acl를 사용하고 총칭 역할을 정의하는 액세스 제어 목록을 구성하기 위해 입니다 * 대부분의 사람들은 Z를 사용하는 어려움이 : 권한


주 (를 사용하거나 수 없습니다) end_Acl은 Module/Controller/Action에서 생각하기 때문에 그렇지만 리소스를 정의하는 한 가지 방법 일뿐입니다.
리소스는 원하는 응용 프로그램, 컨트롤러 동작,보기, 다른 사용자, 데이터베이스 연결 등 어떤 것이 될 수 있습니다. *

+0

당신이 옳습니다. 저는 Zend_Auth를 사용하여 사용자를 인증하고 Zend_Acl을 사용하여 권한을 부여합니다 (미리 탐색 및 preDispatch에 대한 사용 권한 확인 필터링). 그러나 Zend_Acl을 사용하여 신원이 잘못되었다고 어떻게 판단 할 수 있습니까? 사용자에게 권한이 없거나 이와 유사한 내용이 있어야한다는 의미입니까? –

+0

구체적으로 말하자면, 사이트는 회원 영역으로 만 구성됩니다. 즉, 사용자가 로그인하지 않은 경우 페이지 대신 로그인 양식을 표시해야합니다. 그렇지 않으면 사용자가 로그인 할 때, 그는 허용 된 사이트 부분을 보게됩니다. 따라서 잘못된 정체성이있는 경우 사용자의 역할을 "익명"으로 판단하고 익명으로 처리해야합니다. –

+0

당신은 맞습니다. 역할이 어떻게 작용하는지에 따라, 당신은 덜 관용적 인 역할에서 가장 강력한 것으로 상속받을 수 있습니다. 저는 대개 로그인을 페이지와 로그인에 액세스 할 수있는 유일한 권한으로 나의 시작 역할로 게스트를 사용한 다음 권한을 상승시킵니다. –

0

위의 대답을 수락했지만 나는 다른 것을 필요로한다고 생각합니다.

$auth = Zend_Auth::getInstance(); 
if ($auth->hasIdentity()) { 
    // Identity exists - validate if it's valid 

    $identity = $auth->getIdentity(); 
    if (!HelperClass::validateIdentity($identity)) { //you validation method 
     /* User has stored identity from previous version. 
      * It may miss some important info (like a role value 
      * you added recently). Clear it and require re-login. */ 
     $auth->clearIdentity(); 
     $this->_helper->flashMessenger('Please login ...'); 
     $this->_helper->redirector('login'); 
    } 
    // identity is valid 
    $acl = Acl::factory(); //get acl object somehow 
    if (!$acl->isAllowed($module.$controller.$action, $identity->role)) { 
     throw new AccessDeniedException(); 
    } 
    // else nothing -> user has valid session data and is allowed to access the resource. 
} 
+0

맞습니다.하지만 "현재 사용자가 로그인했는지"의 논리가 특정 장소에서 캡슐화되지 않았 으면합니다. 그것은 일종의 느슨한 위험없이 몇 군데에서 그 논리를 재사용 할 수 있습니다. Acl은 분명히 그 장소 인 것 같습니다. 그리고 예제에서 hasIdentity()를 검증하면 유효성 검사가 로직을 덜 응집력있게 만드는 두 개의 다른 클래스 (코드 조각) 사이에 분산됩니다. –

+3

AcL은 해당 IMO에 적합하지 않습니다. ACL은 로그인 한 사용자를 수신하고 사용자가 특정 자원에 액세스 할 수 있는지 여부를 결정합니다. 사용자가 로그인했는지 여부를 결정해서는 안됩니다 ... –