2011-09-24 3 views
2

사용자 데이터를 보호하는 가장 좋은 방법을 연구하려고합니다. 예 : 응용 프로그램에 '위젯'테이블이 있으며, 각 사용자는 필요한만큼의 위젯을 가질 수 있습니다. 응용 프로그램은 로그인 한 사용자의 ID를 참조한 'userId'열에 의해 '위젯'을 식별합니다.젠드 프레임 워크 : DB/모델 : 다른 사용자 보안 행 - 구체적인 메소드 재정의

현재 내 모델에서 fetchAll() 메서드를 재정의하여 userId = X를 추가하면 위젯 데이터에 액세스 할 수 없도록 보호하는 가장 좋은 방법은 params를 parent에 전달하기 전에 다음을 수행하는 것입니다. 그래서 같은 fetchAll은() :

class Model_Widgets extends Zend_Db_Table_Abstract { 

protected $_name = 'widgets'; 

/** 
* Abstracted function to ensure data security 
* Adds in a WHERE to the SELECT to check if this user is the datas owner 
* 
* @see Zend_Db_Table_Abstract::fetchAll() 
*/ 
public function fetchAll($where = null, $order = null, $count = null, $offset = null) 
{ 
    // Handle the additional security check 
    $userId = 'userId = ' . Model_Users::getUser()->id; 
    // Merge the WHERE userId statement with the rest 
    if($where) 
    { 
     if(is_array($where)) 
      $where[] = $userId; 
     else 
      $where = array($where, $userId); 
    } 
    else 
     $where = $userId; 

    return parent::fetchAll($where, $order, $count, $offset); 
} 

이 방법은 잘 작동하지만 내가 더 좋은 방법이 있어야한다고 생각하는 데 도움이 캔트, 나는 최근에 $ _rowClass을 발견하지만, 아직도 내가 개념을 이해 확실하지 오전있다. 이러한 보안 검사를 적용하는 유일한 방법을 재정의하는 것이 유일한 방법 인 경우 도우미를 통해 각 모델 대신 한 번만 재정의하고 사용자를 확인해야하는 각 모델에 다음과 같은 기능을 추가하기 만하면됩니다 행에 대해 :

public function fetchAll(...) 
{ 
    return SecurityCheckHelper::fetchAll(...); 

나는 실제로 내가 할 노력하고 모든 등 고마워

답변

0
에게 URL의 ID 년대에 대한 재생하여 확인 사용자 캔트 액세스 다른 사용자의 데이터를 확인하고,이 말이 희망

현재 fetchAll() 메서드를 재정의하여 위젯 데이터에 액세스하지 못하도록 보호하는 가장 좋은 방법은 다음과 같습니다. 내 모델은이 나중에 성가신 버그가 발생할 수 있기 userId를이 = X

() 부모에게 PARAMS을 통과 :: fetchAll을하기 전에 당신은 정말 다음 Zend_Db_Table_Abstract의 모든 기능에 대해이 작업을 수행해야하는 위치에 추가 할 수 있습니다.

이러한 보안 검사를 통해 도우미를 통해 각 모델보다 한 번 무시하고 한 행에 대해 사용자를 확인해야하는 각 모델에 다음과 같은 기능을 추가하기 만하면됩니다.

모든 모델에 대해이 기능을 구현하는 새로운 추상 기본 클래스를 만들면 어떨까요? My_Db_Table_Abstract extends Zend_Db_Table_Abstract처럼.

이해야 할 시도하고이 컨트롤러의 작업 인 URL 등

의 ID 년대에 대한 재생하여 확인 사용자 캔트 액세스 다른 사용자의 데이터를 만들 것입니다!

내 프로젝트에서는 ACL과 사용자 지정 어설 ​​션 (내 모델에서)을 사용하여이 문제를 해결했습니다. 따라서 모델을 변경하지 않고도 추가 수정이 가능합니다.

+0

감사합니다. Zend가이를 달성하는 최선의 방법을 생각해 냈을 것입니다. 명백하게 모든 CRUD를 허용하기 전에 행을 사용자가 소유하는지 확인하기 위해 모든 곳에서 체크를 추가 할 수 있지만 프레임 워크를 통해이를 달성하는 정의 된 방법이 있다면 좋을 것입니다 ... – Jucks

+0

감사합니다. 커스텀 어설 션을 언급했는데, 궁극적으로 내가 여기서 찾고 있던 것입니다. 건배. – Jucks