2

を使用して行レベルのセキュリティを実現するにはどうすればよいZend_Db_Selectですか? いくつかのオプションを考えることができますが、それらは実際にはパターンに完全に適合していないようです.

、、、および多くuserscontent異なる ACL レベルがあるとします。これが私が考えた1つの解決策です:

$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');

しかし、ライブラリを拡張または変更して、すでに存在する可能性のあるものを取得することに少し近づきすぎているようですが、よくわかりません。

他の誰かがこの種のニーズを持っていましたか?どのように解決しましたか?

4

2 に答える 2

1

Zend_Db_Select を拡張します。App_Db_Select_Security を作成し、コンストラクターで適切に初期化します。

于 2011-02-17T15:31:31.960 に答える
1

セキュリティがデータベースで制御されている場合は、データベースに参加したままにすることができます:

    $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 を拡張して、アクセスされているテーブルを検査し、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 クラスに含まれているテーブルをループさせ、呼び出すことができるセキュリティ関数があるかどうかを確認してから呼び出します。

もう 1 つのオプション (DB の効率は大幅に低下します) は、すべてのアイテムをクエリし、結果セットを繰り返し処理しながら、返された行に対してセキュリティ チェックを行うことです。

于 2011-02-17T16:00:32.497 に答える