Реализация ограничений ACL, больше, чем разрешить / запретить

Я разработал небольшой, но эффективный фреймворк в стиле MVC для использования в приложении, и я реализую проверку ACL по запросу.

Краткие сведения: PHP 5.3+; MySQL 5.1+; Пользовательский фреймворк, "подобный MVC"

На данный момент проверка ACL проста " 00 и 17:00.

  • Разрешить только данной группе вызывать обработчик для изменения «принадлежащих» данных; то есть: данные, созданные ассоциированным пользователем . Эта проверка могла бы включать, возможно, проверку поля user_id , связанного с контентом, который должен быть изменен обработчиком, и user_id , связанного с запросом
  • , который я получил столбец flags , однако он не годится для будущего с введением дополнительных требований к функциям, группам и ограничениям. Я думал в следующем направлении, но что использовать?

    permission
    +---------------+----------------------------+
    | permission_id | handler_key   | constraint |
    +---------------+---------------+------------+
    |       1       | lorem_ipsum   |     ?      |
    |       2       | hello_world   |     ?      |
    |       3       | foobar        |     ?      |
    +---------------+---------------+------------+
    

    Излишние пояснения:

    ( Примечание: здесь был набран код, а не копипаста из проекта )

    Чтобы прояснить некоторые жаргоны Вот; обработчики (в частности веб-обработчики) по сути являются контроллерами , для тех, кто знаком с архетипом MVC.

    Их конкретная реализация - это единственный файл PHP, который возвращает функцию, вызываемую диспетчером или вызывающим суб-обработчиком. Например:

    <?php
        $meta = array('subhandlers' => array());
        return function($request, $response) use($meta){
            $response['foo'] = 'bar';
        };
    

    Моя структура использует веб-обработчики и обработчики API ; веб-обработчики загружают данные в объект ответа (в основном набор иерархических представлений ), который генерирует HTML. Данные получаются путем вызова обработчиков API, которые просто возвращают необработанные данные (обработчики API могут рассматриваться как представления модели , возвращаясь к типичной модели MVC)

    Обработчики соединений по сути являются уровнем абстракции, поскольку они сами являются обработчиками, которые вызывают обработчики для агрегирования данных. Моя текущая реализация проверки ACL выполняет беглую проверку всех вложенных обработчиков (через $ meta , {var names = ...

    Я имею дело с системой, в которой следующий код Javascript (который находится вне моего контроля) выполняется в начале страницы

    if (!("console" in window) || !("firebug" in console))
    {
        var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
        "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
        window.console = {};
        for (var i = 0; i < names.length; ++i)
            window.console[names[i]] = function() {}
    }
    

    Этот код, по-видимому, используется для создания имитации console объект для предотвращения ошибок javascript в средах без консоли javascript. Это здорово, за исключением того, что это также препятствует запуску консоли Google Chrome. Условное выражение явно проверяет наличие firebug , но это все

        if (!("console" in window) || !("firebug" in console))
    

    Итак, есть ли способ указать отладчику Chrome повторно инициализировать объект консоли? То есть простым английским языком, скажите Chrome

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

    Я понимаю, что могу сделать что-то вроде

    console.firebug = "faketrue";
    

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

    14
    задан Alan Storm 25 May 2011 в 22:36
    поделиться