2011-02-17 3 views
2

Zend_Db_Select을 사용하여 어떻게 행 수준 보안을 수행 할 수 있습니까? 몇 가지 옵션을 생각해 볼 수는 있지만 실제로 패턴에 맞지 않는 것 같습니다.Zend_Db_Select 행 수준 보안

내가 users, content 및 많은 다양한 ACL 레벨을 가지고 있다고 가정 해 봅니다. 여기에 나는 하나의 솔루션으로 생각 한 것 :

$select = $db->select() 
      ->from('content') 
      ->where('content_type NOT IN (?)', 
        Model_Content::userAllowedContentTypes() 
      ) 
      ->order('date DESC') 
); 

그러나 문제는, 어떤 보안 다양한 유형의 다른 필드를 추가하기로 결정한다면? 그래서 나는 아마도 이런 식으로 생각했습니다 :

/** 
* @var Zend_Db_Select 
*/ 
$where = Model_Content::getWhere(); 
$db->select() 
    ->from('content') 
    ->$where() 
    ->order('date DESC'); 

더 좋았지 만 그다지 좋지 않다고 생각합니다. 내가 원하는 것은 더이 같은 것입니다 :

$db->select() 
    ->from(array('c' => 'content')) 
    ->getPlugin(new Model_Content_Security('c')) 
    ->order('date DESC'); 

하지만 확장하거나 이미있을 수 있습니다 뭔가를 얻을 수있는 라이브러리를 수정에 너무 가까워 것 같은 그런 것 같다,하지만 난 아니에요 꽤 그것을보고.

다른 누구에게도 이런 종류의 필요성이 있었습니까? 어떻게 해결 했습니까?

+0

행 수준의 보안을 통해 CRUD 연산에 대한 보안을 이해했으며 Zend_Db_Table_Row_Abstract 및 Zend_Db_Table_Abstract를 확장하여이 작업을 수행 할 수 있습니다. 그러나 당신이 이것을 필요로하는지 확신 할 수 없을 것입니다. 아마 ACL 주장을 들여다 아마도 당신을 도울 수 있습니다. –

답변

1

보안은 DB 제어되는 경우에 당신은 그것에 가입 왼쪽 수 있습니다

$select = $db->select() 
      ->from('content') 
      ->joinLeft(array('pt'=>'permissionTable'),'content.id = pt.contentId AND pt.userId = ' . $escapedUserId, array()) 
      ->where(pt.contentId IS NOT NULL)   
      ->order('date DESC'); 

을 아마도 테이블에 액세스하고 검사 Zend_Db_Select을 확장하고 매개 변수로 선택 문을 통과하는 보안 개체를 호출 할 수 있습니다 . 예를 들어, 컨텐츠 클래스가 joinLeft() 및 where() 문을 추가 할 책임이있을 수 있습니다.

public function addSecurityToSelect(Zend_Db_Select $select){ 
    return $select->joinLeft(array('pt'=>'permissionTable'),'content.id = pt.contentId AND pt.userId = ' . $escapedUserId, array()) 
        ->where(pt.contentId IS NOT NULL) 

}

이 포함 된 테이블을 통해 확장 된 Zend_Db_Select 클래스 루프, 그것을 호출 한 다음 호출 할 수있는 보안 기능이 있는지 확인하게한다.

또 다른 옵션 (훨씬 덜 효율적인 DB)은 결과 집합을 반복하면서 모든 항목을 쿼리하고 반환 된 행에 대해 보안 검사를 수행하는 것입니다.

1

확장 Zend_Db_Select. App_Db_Select_Security를 ​​만들고 생성자에서 적절하게 초기화하십시오.

관련 문제