Защита метода в CakePHP с использованием POST, а не GET - PullRequest
1 голос
/ 01 марта 2012

Я хочу защитить определенные методы в моем приложении, такие как публикация, отмена публикации и закрытие.Под защитой я имею в виду не авторизацию пользователя, а скорее способность вызывать метод определенным образом.

Я думал о ФОРМИРОВАНИИ методов, вызываемых с помощью POST, а не GET, чтобы человек не могпросто вставьте URL-адрес в адрес (хотя я мог бы просто проверить идентификатор пользователя человека, который делает это).Однако это означает оборачивание каждой кнопки в отдельную форму для каждого вызова метода.

В качестве альтернативы я мог бы использовать GUID, чтобы разрешить метод GET, но удостовериться, что он позволяет только правильному человеку выполнять функцию.1006 * Есть мысли по этому поводу?

До сих пор я пытался:

function publish($id = null)
    {
        $post = $this->Post->find('first',array('conditions'=>array('Post.id'=>Tiny::reverseTiny($id))));

        if ($this->request->is('post') || $this->request->is('put'))
        {
            $this->Post->id = $post['Post']['id'];
            $this->Post->saveField('status', 1);
            $this->Session->setFlash('Your post has been published!');
            $this->redirect(array('controller'=>'posts','action'=>'view','id'=>Tiny::toTiny($post['Post']['id'])));
        }
        else
        {
            die('GET METHOD NOT ALLOWED');
        }
    }

Но, как указано выше, это означает, что ссылка / кнопка для этого метода должна быть в форме, содержащейвызов действия к этому методу.И если у меня есть несколько методов, мне понадобятся несколько форм ...

Cheers

Один из способов, о котором я подумал, - это разрешить метод get, а затем проверить идентификатор пользователя сообщения по сравнению свошел в систему с идентификатором пользователя так:

if ($this->request->is('get'))
        {
            if($post['Post']['user_id'] != $this->Auth->user('id'))
            {
                $this->Session->setFlash('You don\'t have permission to edit that post!');
                $this->redirect(array('controller' => 'posts', 'action' => 'index'));
            }
            else
            {
                $this->Post->id = $post['Post']['id'];
                $this->Post->saveField('status', 1);
                $this->Session->setFlash('Your post has been published!');
                $this->redirect(array('controller'=>'posts','action'=>'view','id'=>Tiny::toTiny($post['Post']['id'])));
            }
        }

Это хорошая практика?

Ответы [ 3 ]

6 голосов
/ 01 марта 2012

(Предположим, CakePHP 2.0 здесь)

Во-первых, вместо вызова die на чеке Post / Get.Бросьте исключение, исключения в торте замечательны ( Исключения ):

if (!$this->request->is('get')) {
    throw new MethodNotAllowedException();
}

Cake также предоставляет возможность создать ссылку для удаления (через сообщение) в вашем шаблоне.

<?php echo $this->Form->postLink('Delete',
    array('action' => 'delete', $post['Post']['id']),
    array('confirm' => 'Are you sure?'));
?>

Редактировать (ссылка): postLink

Это мой первый ответ в переполнении стека.Надеюсь, это было полезно.

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

Звучит так, как будто вам нужен ACL или какая-то форма разрешений, если вы хотите, чтобы только определенные пользователи могли выполнять функцию.Причина, по которой вы не будете использовать что-то вроде того, что вы опубликовали (if($post['Post']['user_id'] != $this->Auth->user('id'))), заключается в том, что вы в конечном итоге будете тиражировать этот код во многих функциях по всей вашей кодовой базе.Это очень неаккуратно.

Однако вам нужно только убедиться, что отправка была отправлена ​​определенным образом, и тогда вам нужно использовать метод с ошибкой выброса.И вы должны быть в состоянии сохранить представление внутри той же функции, например:

public function publish($id = null) {
    if (!$id || !$this->request->is('get') || !$this->request->is('post') || !$this->request->is('put')) {
        throw new MethodNotAllowedException();
    }

    if ($this->request->is('post') || $this->request->is('put')) {
            $this->Post->id = $post['Post']['id'];
            $this->Post->saveField('status', 1);
            $this->Session->setFlash('Your post has been published!');
            $this->redirect(array('controller'=>'posts','action'=>'view','id'=>Tiny::toTiny($post['Post']['id'])));
    }

    if ($this->request->is('get')) {
        // perform your get request here
    }

}
0 голосов
/ 12 февраля 2016

с минимальным кодом $ This-> request-> allowMethod ( 'сообщение');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...