вошедший в систему пользователь может получить доступ к данным других пользователей - PullRequest
0 голосов
/ 27 марта 2012

Пожалуйста, потерпите меня, потому что я новичок в программировании / cakephp, но я не знаю, как запретить пользователю доступ к другим данным пользователя.Когда пользователь входит в систему, он получает панель со своими списками (которые представлены несколькими моделями .... ресторанов, отелей, полей для гольфа, изображениями для каждого списка, информацией о местоположении, купонами и т. Д.).

В зависимости от модели / контроллера, я мог бы иметь пользователя '3' (у которого есть списки отелей), набрать в строке браузера / restaurant / edit / 1 и отредактировать информацию о ресторане пользователя '17', у которого естьресторан с ID = '1'.Хуже того, они могут даже получить доступ к / users / dashboard / 17.Как мне ограничить доступ пользователей только к своим данным?Я надеялся, что в AuthComponent есть какая-то часть beforeAllow (), которую я мог бы использовать в AppController, который заранее проверяет идентификатор пользователя и возвращает его обратно на свою панель мониторинга, если они пытаются выполнить действие CRUD над данными других пользователей.

Даже если бы я использовал ACL (я знаю, что должен, но, честно говоря, это слишком сложно для меня на данном этапе обучения), мне все равно придется знать правильный код, чтобы ограничить доступ пользователей, верно?

Ниже мой AppController:

class AppController extends Controller {

 public $components = array(
    'Session',
    'Auth' => array(
        'loginRedirect' => array('controller' => 'users', 'action' => 'view'),
        'logoutRedirect' => array('controller' => 'docs', 'action' => 'index'),
        'authError' => 'Sorry, you are not authorized to view this page.'
    )
);


function beforeFilter() {



    $this->Auth->userModel = 'User'; 
    $this->Auth->allow('join_now','debug','index', 'condos', 'houses', 'hotels_and_motels', 'print_all_coupons', 'print_coupon', 'search', 'golf', 'charters', 'events', 'nightlife', 'shopping', 'visitors_info', 'contact_us', 'view', 'results');

}


}

, а вот примерная функция редактирования (функция редактирования из моего UnitsController):

function edit($id) {
   $this->set('title', 'Edit your property');
   $this->Unit->id = $id;  

    if (empty($this->request->data)) {        
      $this->request->data = $this->Unit->read();    
} else { 

    if ($this->Unit->saveAll($this->request->data)) {  

        $this->Session->setFlash('Your property has been updated.', 'success'); 

    } 
}
}

Я скажу, что каждыйодна из моих таблиц базы данных имеет поле user_id, поэтому зарегистрированный пользователь может быть сопоставлен с user_id каждой модели.

Я думал, что этот вопрос SO был тем, что я искал, но онизакончил тем, что начал касаться его и никогда не отвечал на первоначальный вопрос, заданный пользователем.

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Я думаю, вам нужно будет использовать CRUD-авторизацию для добавления действий EditOwn. Ответ, описанный в Настройка базы данных ACL CakePHP: структура ARO / ACO? обрабатывает большую часть необходимой вам логики.

Обратите внимание, что решение все еще не завершено, и вы получите доступ к действиям, которые могут отображать данные других пользователей. Пример: scaffold 'index' методы. Чтобы ограничить доступ к данным других пользователей, вы можете изменить запрос, добавив фильтры на основе идентификатора пользователя, полученного из сеанса.

1 голос
/ 28 марта 2012

Если вы использовали торты acl и auth, то нет, вам не нужно было бы писать кучу кода, проверяя идентификаторы пользователя для каждого действия, но вам нужно было бы написать код, чтобы связать вместе acl. Вы сказали бы Компоненту, что ваш контроллер и действия требуют привилегий acl. И он не просматривает таблицы aros и acos, чтобы убедиться, что у вашего объекта, запрашивающего содержимое, есть надлежащие разрешения.

Я НАСТОЯТЕЛЬНО рекомендую вам взглянуть на учебник и выяснить, как заставить его работать

Если вы не пойдете по этому пути, вам придется добавить проверку для каждого действия, которое загружает зависимый контент. По сути, когда вы запрашиваете действие, вы добавляете объект, затем связываете пользователя с этим объектом и проверяете, совпадает ли идентификатор пользователя с идентификатором запрашивающего объекта.

if ( $this->Unit->User->uid != $this->Session->User->uid ) {
    throw new NotFoundException('Could not find that Unit');
} else {
    ...
}

Другая вещь, которую вы можете сделать, для страниц, которые одинаковы, но настроены, не использовать URL /user/dashboard/17, а вместо этого просто использовать /user/dashboard, а затем в действии панели мониторинга извлечь идентификатор пользователя из данных сеанса и загрузить профиль для аутентифицируемого пользователя

...