RedBean PHP: есть ли способ защитить столбец базы данных от изменения? (например: inserttion_date) - PullRequest
1 голос
/ 21 сентября 2011

Уже использовано столько ОРМ, сколько вы можете себе представить. В данный момент я влюблен в ненависть к RedBean PHP. Итак, после нескольких часов его изучения у меня возникло сомнение в том, что является лучшим способом решения этой самой основной проблемы (в данном случае лучший способ означает способ, который лучше соответствует философии простоты использования RedBean):

Очень часто ограничивают доступ к некоторым свойствам наших классов, чтобы мы могли предотвратить некоторые виды неправильных манипуляций с данными. Это обычно достигается с хорошим использованием геттеров и сеттеров. Но, насколько уже известно о RedBean, в нативных классах нет формальных установщиков, только некоторые открытые свойства, которые можно изменить и сохранить в базе данных.

Что я хотел бы сделать, это защитить некоторые свойства от изменения вручную, чтобы я не мог заставить других программистов создавать какие-либо странности вроде:

$beam->insertion_date = 'yesterday';
R::store($beam);

Это поле никогда не должно изменяться после вставки строки, очевидно, но мы не можем просто доверять, что никто этого не сделает. Есть ли способ сделать что-то вроде включения inserttion_date защищенным свойством или каким-то образом сделать его недоступным?

У меня такое ощущение, что лучший способ сделать это - использовать $beam->setMetadata() и объявить, что данное свойство не должно быть изменено, но я не знаю, как этого добиться в RedBean, и все еще не могу найти достаточно информация в официальном руководстве. Любая помощь приветствуется.

Спасибо за чтение.

Ответы [ 3 ]

3 голосов
/ 21 сентября 2011

Единственный пуленепробиваемый способ защитить вашу базу данных от несанкционированных или непреднамеренных изменений - это использовать систему привилегий вашей базы данных (GRANT и REVOKE), используя различные профили пользователей с конкретными привилегиями вплоть до уровня столбцов и т. Д.

Возможно, это нелегко реализовать, но при сохранении привилегий в (настраиваемом) коде всегда будут лазейки.

1 голос
/ 23 ноября 2011

Другой способ - установить тип данных столбца на тип с указанным статусом.

Например, если вы измените varchar (255) на varchar (254), RedBeanPHP обнаружит изменение и уйдетодин столбец, потому что теперь он является указанным столбцом, для int можно использовать, например, INT (10)Специальные типы никогда не будут конвертированы: ENUM / DATE и т. Д.

0 голосов
/ 26 сентября 2011

Нашли решение!

  1. В вашей модели сохраняйте состояние компонента в частном свойстве каждый раз, когда компонент загружается из базы данных.
  2. Прежде чем положить вещи обратно в базу данных, проверьте, были ли значения, которые не должны были быть изменены, программно.

    • В положительном случае, бросить исключение или добавить любое другое событие в предупредить программистов, что они пытаются изменить , вероятно, ошибка поле, которое не должно быть изменено.

Вот так должна выглядеть примерная модель:

class Model_book extends RedBean_SimpleModel{

    protected $before = false;

    public function open(){
        if($this->bean->id){
            $this->before = clone($this->bean);
        }
    }

    public function update(){
        if($this->bean->id){
            if($this->before->insertion_date != $this->bean->insertion_date){
                throw new exception ("The insertion_date can't be changed.");
            }
        }
    }
}

Так что теперь следующий код приведет к исключению:

$beam->insertion_date = 'yesterday';
R::store($beam);

Примечание: использование метаинформационного API RedBean было бы лучше решение, но не имеет смысла добавлять (только) эту проверку критерии без добавления полного слоя проверки поверх RedBean. На с другой стороны, добавление пользовательской полной проверки станет бесполезным в Если встроенная проверка будет добавлена ​​в ORM в ближайшем будущем (я Держу пари, что это произойдет), поэтому я оставлю это как есть.

Надеюсь, это поможет.

...