Однофайловый PHP-скрипт, который добавляет REST API в базу данных MySQL/MariaDB, PostgreSQL, SQL Server или SQLite.
Как: Загрузите « api.php
» на свой веб-сервер, настройте его для подключения к вашей базе данных и получите мгновенный полнофункциональный REST API.
Примечание. Это эталонная реализация TreeQL на PHP.
PHP 7.2 или выше с драйверами PDO, включенными для одной из этих систем баз данных:
MySQL 5.7/MariaDB 10.0 или выше для пространственных функций в MySQL.
PostgreSQL 9.5 или более поздняя версия с PostGIS 2.2 или более поздняя версия для пространственных объектов
SQL Server 2017 или более поздней версии (2019 также поддерживает Linux)
SQLite 3.16 или выше (пространственные функции НЕ поддерживаются)
Загрузите файл « api.php
» из последней версии:
https://github.com/mevdschee/php-crud-api/releases/latest или напрямую с:
https://raw.githubusercontent.com/mevdschee/php-crud-api/main/api.php
Это однофайловое приложение! Загрузите « api.php
» куда-нибудь и наслаждайтесь!
Для локальной разработки вы можете запустить встроенный веб-сервер PHP:
php -S localhost:8080
Протестируйте скрипт, открыв следующий URL-адрес:
http://localhost:8080/api.php/records/posts/1
Не забудьте изменить конфигурацию внизу файла.
Альтернативно вы можете интегрировать этот проект в выбранную вами веб-инфраструктуру, см.:
Автоматический REST API для Laravel
Автоматический REST API для Symfony 4
Автоматический REST API для SlimPHP 4
В этих интеграциях Composer используется для загрузки этого проекта как зависимости.
Для людей, которые не используют композитор, предоставляется файл « api.include.php
». Этот файл содержит все из « api.php
», кроме конфигурации из « src/index.php
», и может использоваться функцией PHP «include».
Отредактируйте следующие строки внизу файла « api.php
»:
$config = new Config([ 'username' => 'xxx', 'password' => 'xxx', 'database' => 'xxx', ]);
Это все параметры конфигурации и их значения по умолчанию в скобках:
«драйвер»: mysql
, pgsql
, sqlsrv
или sqlite
( mysql
)
«адрес»: имя хоста (или имя файла) сервера базы данных ( localhost
).
«порт»: TCP-порт сервера базы данных (по умолчанию используется драйвер по умолчанию).
«имя пользователя»: имя пользователя, подключающегося к базе данных (по умолчанию нет).
«пароль»: пароль пользователя, подключающегося к базе данных (по умолчанию нет).
«база данных»: база данных, к которой осуществляется подключение (по умолчанию нет).
«команда»: дополнительный SQL для инициализации соединения с базой данных (нет)
«tables»: список таблиц для публикации, разделенных запятыми (по умолчанию «все»).
«сопоставление»: список сопоставлений таблиц и столбцов, разделенных запятыми (без сопоставления).
«geometrySrid»: SRID, предполагаемый при преобразовании из WKT в геометрию ( 4326
).
«промежуточное программное обеспечение»: список промежуточного программного обеспечения для загрузки ( cors
)
«контроллеры»: список контроллеров для загрузки ( records,geojson,openapi,status
).
«customControllers»: список пользовательских контроллеров для загрузки (по умолчанию нет).
"openApiBase": информация OpenAPI ( {"info":{"title":"PHP-CRUD-API","version":"1.0.0"}}
)
«cacheType»: TempFile
, Redis
, Memcache
, Memcached
или NoCache
( TempFile
).
«cachePath»: Путь/адрес кэша (по умолчанию — временный каталог системы)
«cacheTime»: количество секунд, в течение которых кэш действителен ( 10
).
«jsonOptions»: параметры, используемые для кодирования JSON ( JSON_UNESCAPED_UNICODE
).
«debug»: показывать ошибки в заголовках «X-Exception» ( false
).
«basePath»: базовый путь URI API (по умолчанию определяется с помощью PATH_INFO).
Все параметры конфигурации также доступны как переменные среды. Напишите параметр конфигурации заглавными буквами, префиксом «PHP_CRUD_API_» и подчеркиванием для разрывов слов, например:
PHP_CRUD_API_DRIVER=mysql
PHP_CRUD_API_ADDRESS=локальный хост
PHP_CRUD_API_PORT=3306
PHP_CRUD_API_DATABASE=php-crud-api
PHP_CRUD_API_USERNAME=php-crud-api
PHP_CRUD_API_PASSWORD=php-crud-api
PHP_CRUD_API_DEBUG=1
Переменные среды имеют приоритет над конфигурацией PHP.
Эти ограничения и ограничения применяются:
Первичные ключи должны либо автоматически увеличиваться (от 1 до 2 ^ 53), либо иметь UUID.
Составные первичные и составные внешние ключи не поддерживаются.
Сложные записи (транзакции) не поддерживаются.
Функции вызова сложных запросов (например, «concat» или «sum») не поддерживаются.
База данных должна поддерживать и определять ограничения внешнего ключа.
SQLite не может иметь автоматически увеличивающиеся первичные ключи с типом bigint
SQLite не поддерживает изменение столбцов (структуры) таблицы.
Поддерживаются следующие функции:
Установка Composer или отдельный PHP-файл, легко развертываемый.
Очень мало кода, легко адаптировать и поддерживать
Поддерживает переменные POST в качестве входных данных (x-www-form-urlencoded)
Поддерживает объект JSON в качестве входных данных.
Поддерживает массив JSON в качестве входных данных (пакетная вставка)
Обеззараживание и проверка входных данных с помощью правил типов и обратных вызовов.
Система разрешений для баз данных, таблиц, столбцов и записей
Поддерживаются мультитенантные макеты с одной и несколькими базами данных.
Поддержка многодоменного CORS для междоменных запросов.
Поддержка чтения объединенных результатов из нескольких таблиц.
Поиск поддержки по нескольким критериям
Разбиение на страницы, сортировка, верхний список N и выбор столбца
Обнаружение связей с помощью вложенных результатов (belongsTo, hasMany и HABTM)
Поддержка атомарного приращения через PATCH (для счетчиков)
Двоичные поля поддерживаются кодировкой Base64.
Пространственные/ГИС-поля и фильтры, поддерживаемые WKT и GeoJSON.
Сопоставление имен таблиц и столбцов для поддержки устаревших систем.
Создание документации API с помощью инструментов OpenAPI.
Аутентификация через ключ API, токен JWT или имя пользователя/пароль.
Параметры подключения к базе данных могут зависеть от аутентификации
Поддержка чтения структуры базы данных в формате JSON.
Поддержка изменения структуры базы данных с использованием конечной точки REST.
Включено промежуточное ПО для повышения безопасности.
Соответствие стандартам: PSR-4, PSR-7, PSR-12, PSR-15 и PSR-17.
Связанные проекты:
PHP-CRUD-API Quick Start: настраиваемый, готовый к работе файл для создания докера с PHP-CRUD-API.
Генератор фильтров PHP-CRUD-API: библиотека JavaScript, создающая фильтры PHP-CRUD-API на основе выражений.
JS-CRUD-API: клиентская библиотека JavaScript для API PHP-CRUD-API.
PHP-API-AUTH: однофайловый PHP-скрипт, который является поставщиком аутентификации для PHP-CRUD-API.
PHP-CRUD-UI: однофайловый PHP-скрипт, который добавляет пользовательский интерфейс в проект PHP-CRUD-API.
PHP-CRUD-ADMIN: однофайловый PHP-скрипт, который добавляет интерфейс администратора базы данных в проект PHP-CRUD-API.
PHP-SP-API: однофайловый PHP-скрипт, который добавляет REST API в базу данных SQL.
dexie-mysql-sync: синхронизация между локальной базой данных IndexedDB и базой данных MySQL.
ra-data-treeql: пакет NPM, который предоставляет поставщика данных для администратора React.
scriptPilot/vueuse: Vue Composables в дополнение к VueUse.org (которые поддерживают PHP-CRUD-API).
scriptPilot/add-php-backend: добавьте MySQL, phpMyAdmin и PHP-CRUD-API в свою среду разработки.
VUE-CRUD-UI: однофайловый скрипт Vue.js, который добавляет пользовательский интерфейс в проект PHP-CRUD-API.
Также есть порты этого скрипта:
Go-CRUD-API (в разработке)
Java JDBC от Ивана Колчагова (v1)
Java Spring Boot + jOOQ (v2: работа продолжается)
Существуют также экспериментальные версии этого скрипта, которые поддерживают только базовые функции REST CRUD в: PHP, Java, Go, C# .net core, Node.js и Python.
Вы можете установить все зависимости этого проекта, используя следующую команду:
php install.php
Вы можете скомпилировать все файлы в один файл « api.php
», используя:
php build.php
Обратите внимание, что вы не используете компиляцию при интеграции этого проекта в другой проект или платформу (вместо этого используйте Composer).
Вы можете получить доступ к некомпилированному коду по URL-адресу:
http://localhost:8080/src/records/posts/1
Некомпилированный код находится в каталогах « src
» и « vendor
». Каталог « vendor
» содержит зависимости.
Вы можете обновить все зависимости этого проекта, используя следующую команду:
php update.php
Этот скрипт установит и запустит Composer для обновления зависимостей.
NB: Скрипт обновления исправит зависимости в каталоге поставщика для совместимости с PHP 7.0.
TreeQL позволяет вам создавать «дерево» объектов JSON на основе структуры (отношений) вашей базы данных SQL и вашего запроса.
Он основан на стандарте REST, а также на основе json:api.
В таблице сообщений в качестве примера имеется всего несколько полей:
posts ======= id title content created
Операции CRUD + List, приведенные ниже, действуют на эту таблицу.
Если вы хотите создать запись, запрос можно записать в формате URL-адреса следующим образом:
POST /records/posts
Вам необходимо отправить тело, содержащее:
{ "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" }
И он вернет значение первичного ключа вновь созданной записи:
2
Чтобы прочитать запись из этой таблицы, запрос можно записать в формате URL следующим образом:
GET /records/posts/1
Где «1» — значение первичного ключа записи, которую вы хотите прочитать. Он вернется:
{ "id": 1 "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }
При операциях чтения вы можете применять соединения.
Чтобы обновить запись в этой таблице, запрос можно записать в формате URL-адреса следующим образом:
PUT /records/posts/1
Где «1» — значение первичного ключа записи, которую вы хотите обновить. Отправить как тело:
{ "title": "Adjusted title!" }
Это корректирует заголовок сообщения. Возвращаемое значение — это количество установленных строк:
1
Если вы хотите удалить запись из этой таблицы, запрос можно записать в формате URL следующим образом:
DELETE /records/posts/1
И он вернет количество удаленных строк:
1
Чтобы получить список записей из этой таблицы, запрос можно записать в формате URL следующим образом:
GET /records/posts
Он вернется:
{ "records":[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" } ] }
К операциям со списками вы можете применять фильтры и объединения.
Фильтры предоставляют функции поиска при вызовах списков с использованием параметра «filter». Вам необходимо указать имя столбца, запятую, тип соответствия, еще одну запятую и значение, по которому вы хотите фильтровать. Поддерживаются следующие типы соответствия:
«cs»: содержит строку (строка содержит значение)
«sw»: начать с (строка начинается со значения)
"ew": закончить на (строка заканчивается значением)
«eq»: равно (точное совпадение строки или числа)
«lt»: меньше (число меньше значения)
«le»: меньше или равно (число меньше или равно значению)
«ge»: больше или равно (число больше или равно значению)
«gt»: больше (число больше значения)
«bt»: между (число находится между двумя значениями, разделенными запятыми)
«in»: in (число или строка находится в списке значений, разделенных запятыми)
«is»: имеет значение NULL (поле содержит значение «NULL»)
Вы можете отменить все фильтры, добавив к началу символ «n», чтобы «eq» стало «neq». Примеры использования фильтров:
GET /records/categories?filter=name,eq,Internet GET /records/categories?filter=name,sw,Inter GET /records/categories?filter=id,le,1 GET /records/categories?filter=id,ngt,1 GET /records/categories?filter=id,bt,0,1 GET /records/categories?filter=id,in,0,1
Выход:
{ "records":[ { "id": 1 "name": "Internet" } ] }
В следующем разделе мы углубимся в то, как можно применить несколько фильтров к одному вызову списка.
Фильтры можно применять, повторяя параметр «фильтр» в URL-адресе. Например, следующий URL:
GET /records/categories?filter=id,gt,1&filter=id,lt,3
запросит все категории «где id > 1 и id < 3». Если вы хотите «где id = 2 или id = 4», вы должны написать:
GET /records/categories?filter1=id,eq,2&filter2=id,eq,4
Как видите, мы добавили число к параметру «фильтр», чтобы указать, что следует применять «ИЛИ» вместо «И». Обратите внимание, что вы также можете повторить «фильтр1» и создать «И» внутри «ИЛИ». Поскольку вы также можете пойти на один уровень глубже, добавив букву (af), вы можете создать практически любое достаточно сложное дерево условий.
Примечание. Фильтровать можно только по запрошенной таблице (не по включенным в нее таблицам), а фильтры применяются только при вызовах списков.
По умолчанию выбраны все столбцы. С помощью параметра «include» вы можете выбрать определенные столбцы. Вы можете использовать точку, чтобы отделить имя таблицы от имени столбца. Несколько столбцов должны быть разделены запятыми. Звездочку («*») можно использовать в качестве подстановочного знака для обозначения «всех столбцов». Подобно «include», вы можете использовать параметр «exclude» для удаления определенных столбцов:
GET /records/categories/1?include=name GET /records/categories/1?include=categories.name GET /records/categories/1?exclude=categories.id
Выход:
{ "name": "Internet" }
Примечание. Столбцы, которые используются для включения связанных объектов, добавляются автоматически, и их нельзя исключить из вывода.
С помощью параметра «порядок» вы можете сортировать. По умолчанию сортировка осуществляется по возрастанию, но, указав «desc», ее можно изменить на обратную:
GET /records/categories?order=name,desc GET /records/categories?order=id,desc&order=name
Выход:
{ "records":[ { "id": 3 "name": "Web development" }, { "id": 1 "name": "Internet" } ] }
NB: Вы можете сортировать по нескольким полям, используя несколько параметров «порядка». Вы не можете заказывать по «соединенным» столбцам.
Параметр size ограничивает количество возвращаемых записей. Это можно использовать для первых N списков вместе с параметром «порядок» (используйте порядок по убыванию).
GET /records/categories?order=id,desc&size=1
Выход:
{ "records":[ { "id": 3 "name": "Web development" } ] }
Примечание. Если вы также хотите узнать общее количество записей, вы можете использовать параметр «страница».
Параметр «страница» содержит запрошенную страницу. Размер страницы по умолчанию — 20, но его можно изменить (например, до 50).
GET /records/categories?order=id&page=1 GET /records/categories?order=id&page=1,50
Выход:
{ "records":[ { "id": 1 "name": "Internet" }, { "id": 3 "name": "Web development" } ], "results": 2 }
Элемент «results» содержит общее количество записей в таблице, которое будет возвращено, если не будет использоваться нумерация страниц.
Примечание. Поскольку неупорядоченные страницы не могут быть разбиты на страницы, страницы будут упорядочены по первичному ключу.
Допустим, у вас есть таблица сообщений с комментариями (оставленными пользователями), а сообщения могут иметь теги.
posts comments users post_tags tags ======= ======== ======= ========= ======= id id id id id title post_id username post_id name content user_id phone tag_id created message
Если вы хотите перечислить сообщения с их комментариями, пользователями и тегами, вы можете запросить два «деревовидных» пути:
posts -> comments -> users posts -> post_tags -> tags
Эти пути имеют один и тот же корень, и этот запрос можно записать в формате URL как:
GET /records/posts?join=comments,users&join=tags
Здесь разрешено опустить промежуточную таблицу, которая привязывает посты к тегам. В этом примере вы видите все три типа отношений таблицы (hasMany, ownTo и hasAndBelongsToMany):
«пост» имеет много «комментариев»
«комментарий» принадлежит «пользователю»
«пост» имеет и принадлежит многим «тегам»
Это может привести к получению следующих данных JSON:
{ "records":[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z", "comments": [ { id: 1, post_id: 1, user_id: { id: 1, username: "mevdschee", phone: null, }, message: "Hi!" }, { id: 2, post_id: 1, user_id: { id: 1, username: "mevdschee", phone: null, }, message: "Hi again!" } ], "tags": [] }, { "id": 2, "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z", "comments": [], "tags": [ { id: 1, message: "Funny" }, { id: 2, message: "Informational" } ] } ] }
Вы видите, что связи «belongsTo» обнаружены, и значение внешнего ключа заменяется объектом, на который ссылается. В случае «hasMany» и «hasAndBelongsToMany» имя таблицы используется как новое свойство объекта.
Если вы хотите создать, прочитать, обновить или удалить, вы можете указать в URL-адресе несколько значений первичного ключа. Вам также необходимо отправить массив вместо объекта в теле запроса для создания и обновления.
Чтобы прочитать запись из этой таблицы, запрос можно записать в формате URL следующим образом:
GET /records/posts/1,2
Результатом может быть:
[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }, { "id": 2, "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" } ]
Аналогично, если вы хотите выполнить пакетное обновление, запрос в формате URL записывается как:
PUT /records/posts/1,2
Где «1» и «2» — значения первичных ключей записей, которые вы хотите обновить. Тело должно содержать столько же объектов, сколько первичных ключей в URL:
[ { "title": "Adjusted title for ID 1" }, { "title": "Adjusted title for ID 2" } ]
Это корректирует заголовки сообщений. Возвращаемые значения — это количество установленных строк:
[1,1]
Это означает, что было две операции обновления, и каждая из них установила одну строку. Пакетные операции используют транзакции базы данных, поэтому все они либо завершаются успешно, либо все завершаются неудачей (успешные операции откатываются). В случае неудачи тело будет содержать список документов с ошибками. В следующем ответе первая операция завершилась успешно, а вторая операция пакета завершилась неудачно из-за нарушения целостности:
[ { "code": 0, "message": "Success" }, { "code": 1010, "message": "Data integrity violation" } ]
Код состояния ответа всегда будет 424 (неудачная зависимость) в случае сбоя одной из пакетных операций.
Чтобы вставить несколько записей в эту таблицу, запрос можно записать в формате URL следующим образом:
POST /records/posts
Тело должно содержать массив записей, которые необходимо вставить:
[ { "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }, { "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" } ]
Возвращаемое значение также представляет собой массив, содержащий первичные ключи вновь вставленных записей:
[1,2]
Обратите внимание, что пакетная операция DELETE выполняется по тому же шаблону, что и PUT, но без тела.
Для пространственной поддержки существует дополнительный набор фильтров, которые можно применять к столбцам геометрии и которые начинаются с буквы «s»:
«sco»: пространственное содержит (геометрия содержит другое)
«scr»: пространственные кресты (геометрия пересекает другую)
«sdi»: пространственное непересекающееся (геометрия не пересекается с другой)
«seq»: пространственное равенство (геометрия равна другой)
«грех»: пространство пересекается (геометрия пересекает другое)
"сов": пространственные перекрытия (геометрия перекрывает другую)
«сто»: пространственные прикосновения (геометрия касается другого)
«swi»: пространственное внутри (геометрия внутри другого)
«так в оригинале»: пространственное закрыто (геометрия закрыта и проста)
«sis»: пространственное просто (геометрия проста)
«siv»: пространственное допустимо (геометрия допустима)
Эти фильтры основаны на стандартах OGC, а также на спецификации WKT, в которой представлены столбцы геометрии. Обратите внимание, что SRID, который предполагается при преобразовании из WKT в геометрию, указывается переменной конфигурации geometrySrid
и по умолчанию имеет значение 4326 (WGS 84).
Поддержка GeoJSON — это представление таблиц и записей в формате GeoJSON только для чтения. Эти запросы поддерживаются:
method path - operation - description ---------------------------------------------------------------------------------------- GET /geojson/{table} - list - lists records as a GeoJSON FeatureCollection GET /geojson/{table}/{id} - read - reads a record by primary key as a GeoJSON Feature
Конечная точка " /geojson
" использует конечную точку " /records
" внутри себя и наследует все функции, такие как объединения и фильтры. Он также поддерживает параметр «geometry», указывающий имя столбца геометрии, если в таблице их несколько. Для представлений карты поддерживается параметр «bbox», в котором вы можете указать координаты верхнего левого и нижнего правого угла (через запятую). Реализация GeoJSON поддерживает следующие типы геометрии:
Точка
Многоточечный
ЛинияСтрока
Мультилинейная строка
Полигон
Мультиполигон
Функциональность GeoJSON включена по умолчанию, но ее можно отключить с помощью конфигурации «контроллеры».
Чтобы поддержать создание API для (части) устаревшей системы (например, Wordpress), вам может потребоваться сопоставить имена таблиц и столбцов, поскольку их невозможно улучшить без изменения программного обеспечения, в то время как имена могут нуждаться в некотором улучшении для обеспечения согласованности. Конфигурация позволяет переименовывать таблицы и столбцы с помощью списка сопоставлений, разделенных запятыми, которые разделены знаком равенства, например:
'mapping' => 'wp_posts=posts,wp_posts.ID=posts.id',
В этом конкретном примере таблица « wp_posts
» будет представлена в конечной точке « posts
» (вместо « wp_posts
») и столбец « ID
» внутри этой таблицы как свойство « id
» (в нижнем регистре вместо верхнего регистра).
Примечание. Поскольку эти два сопоставления перекрываются, первое (менее конкретное) сопоставление можно опустить.
Вы можете включить следующее промежуточное программное обеспечение, используя параметр конфигурации «middlewares»:
«брандмауэр»: ограничить доступ к определенным IP-адресам.
«sslRedirect»: принудительное соединение через HTTPS вместо HTTP.
«cors»: поддержка запросов CORS (включена по умолчанию).
«xsrf»: блокировать атаки XSRF с помощью метода «Double Submit Cookie».
«ajaxOnly»: Ограничить запросы, отличные от AJAX, чтобы предотвратить атаки XSRF.
«apiKeyAuth»: поддержка «Аутентификации ключа API».
«apiKeyDbAuth»: поддержка «Аутентификации базы данных ключей API».
«dbAuth»: поддержка «Аутентификации базы данных».
«wpAuth»: поддержка «Аутентификации WordPress».
«jwtAuth»: поддержка «Аутентификации JWT».
«basicAuth»: поддержка «базовой аутентификации».
«reconnect»: повторно подключиться к базе данных с другими параметрами.
«авторизация»: ограничить доступ к определенным таблицам или столбцам.
«проверка»: возвращает ошибки проверки ввода для пользовательских правил и правил типа по умолчанию.
«ipAddress»: заполните защищенное поле IP-адресом при создании.
«санитария»: применять входную санацию при создании и обновлении.
«multiTenancy»: ограничивает доступ арендаторов в сценарии с несколькими арендаторами.
«pageLimits»: ограничивает операции со списком, чтобы предотвратить очистку базы данных.
«joinLimits»: ограничивает параметры соединения, чтобы предотвратить очистку базы данных.
«textSearch»: поиск по всем текстовым полям с помощью простого параметра.
«кастомизация»: предоставляет обработчики для настройки запросов и ответов.
«json»: поддержка чтения/записи строк JSON в виде объектов/массивов JSON.
«xml»: переводит все входные и выходные данные из JSON в XML.
Параметр конфигурации «middlewares» представляет собой список включенных промежуточных программ, разделенных запятыми. Вы можете настроить поведение промежуточного программного обеспечения, используя параметры конфигурации, специфичные для промежуточного программного обеспечения:
«firewall.reverseProxy»: установлено значение «true», когда используется обратный прокси («»)
«firewall.allowedIpAddresses»: список IP-адресов, которым разрешено подключение («»)
«cors.allowedOrigins»: источники, разрешенные в заголовках CORS («*»)
«cors.allowHeaders»: заголовки, разрешенные в запросе CORS («Content-Type, X-XSRF-TOKEN, X-Authorization»).
«cors.allowMethods»: методы, разрешенные в запросе CORS («OPTIONS, GET, PUT, POST, DELETE, PATCH»).
«cors.allowCredentials»: разрешить учетные данные в запросе CORS («true»).
«cors.exposeHeaders»: заголовки белого списка, к которым браузерам разрешен доступ («»)
«cors.maxAge»: время, в течение которого грант CORS действителен в секундах («1728000»).
«xsrf.excludeMethods»: методы, не требующие защиты XSRF («OPTIONS,GET»).
«xsrf.cookieName»: имя файла cookie защиты XSRF («XSRF-TOKEN»).
«xsrf.headerName»: имя защитного заголовка XSRF («X-XSRF-TOKEN»).
«ajaxOnly.excludeMethods»: методы, не требующие AJAX («OPTIONS, GET»).
«ajaxOnly.headerName»: имя требуемого заголовка («X-Requested-With»)
«ajaxOnly.headerValue»: значение требуемого заголовка («XMLHttpRequest»).
«apiKeyAuth.mode»: установите значение «необязательно», если вы хотите разрешить анонимный доступ («обязательно»).
«apiKeyAuth.header»: имя заголовка ключа API («X-API-Key»).
«apiKeyAuth.keys»: список действительных ключей API («»)
«apiKeyDbAuth.mode»: установите значение «необязательно», если вы хотите разрешить анонимный доступ («обязательно»).
«apiKeyDbAuth.header»: имя заголовка ключа API («X-API-Key»).
«apiKeyDbAuth.usersTable»: таблица, которая используется для хранения пользователей («пользователи»).
«apiKeyDbAuth.apiKeyColumn»: столбец таблицы пользователей, содержащий ключ API («api_key»).
«dbAuth.mode»: установите значение «необязательно», если вы хотите разрешить анонимный доступ («обязательно»).
«dbAuth.usersTable»: таблица, которая используется для хранения пользователей («пользователи»).
«dbAuth.loginTable»: таблица или представление, которое используется для получения информации о пользователях для входа в систему («пользователи»).
«dbAuth.usernameColumn»: столбец таблицы пользователей, содержащий имена пользователей («имя пользователя»).
«dbAuth.passwordColumn»: столбец таблицы пользователей, содержащий пароли («пароль»).
«dbAuth.returnedColumns»: столбцы возвращаются при успешном входе в систему, пустое означает «все» («»)
«dbAuth.usernameFormField»: имя поля формы, которое содержит имя пользователя («имя пользователя»)
«dbAuth.passwordFormField»: имя поля формы, в котором хранится пароль («пароль»).
«dbAuth.newPasswordFormField»: имя поля формы, в котором хранится новый пароль («newPassword»).
«dbAuth.registerUser»: данные пользователя в формате JSON (или «1»), если вы хотите включить конечную точку /register («»)
«dbAuth.loginAfterRegistration»: 1 или ноль, если зарегистрированные пользователи должны войти в систему после регистрации («»)
«dbAuth.passwordLength»: минимальная длина пароля («12»).
«dbAuth.sessionName»: имя запущенного сеанса PHP («»)
«wpAuth.mode»: установите значение «необязательно», если вы хотите разрешить анонимный доступ («обязательно»).
«wpAuth.wpDirectory»: папка/путь, по которому можно найти установку Wordpress («».»)
«wpAuth.usernameFormField»: имя поля формы, которое содержит имя пользователя («имя пользователя»)
«wpAuth.passwordFormField»: имя поля формы, в котором хранится пароль («пароль»).
«jwtAuth.mode»: установите значение «необязательно», если вы хотите разрешить анонимный доступ («обязательно»).
«jwtAuth.header»: имя заголовка, содержащего токен JWT («X-авторизация»).
"jwtAuth.leeway": допустимое количество секунд отклонения часов ("5").
«jwtAuth.ttl»: количество секунд, в течение которых действителен токен («30»).
«jwtAuth.secrets»: общий секретный ключ, используемый для подписи токена JWT с помощью («»)
«jwtAuth.algorithms»: разрешенные алгоритмы, пустое означает «все» («»)
"jwtAuth.audiences": разрешенные аудитории. Пусто означает "все" ("").
«jwtAuth.issuers»: разрешенные эмитенты, пустое означает «все» («»)
«jwtAuth.sessionName»: имя запущенного сеанса PHP («»)
«basicAuth.mode»: установите значение «необязательно», если вы хотите разрешить анонимный доступ («обязательно»).
«basicAuth.realm»: текст запроса при отображении входа в систему («Требуются имя пользователя и пароль»).
«basicAuth.passwordFile»: файл для чтения комбинаций имени пользователя и пароля («.htpasswd»).
«basicAuth.sessionName»: имя запущенного сеанса PHP («»)
«reconnect.driverHandler»: обработчик для извлечения драйвера базы данных («»)
«reconnect.addressHandler»: обработчик для получения адреса базы данных («»)
«reconnect.portHandler»: обработчик для получения порта базы данных («»)
«reconnect.databaseHandler»: обработчик для получения имени базы данных («»)
"reconnect.tablesHandler": обработчик для получения имен таблиц ("")
«reconnect.mappingHandler»: обработчик для реализации получения сопоставления имен («»)
«reconnect.usernameHandler»: обработчик для получения имени пользователя базы данных («»)
«reconnect.passwordHandler»: обработчик для получения пароля базы данных («»)
"authorization.tableHandler": Обработчик для реализации правил авторизации таблицы ("")
"authorization.columnHandler": Обработчик для реализации правил авторизации столбцов ("")
"authorization.pathHandler": Обработчик для реализации правил авторизации пути ("")
"authorization.recordHandler": Обработчик для реализации правил фильтра авторизации записей ("")
«validation.handler»: обработчик для реализации правил проверки входных значений («»)
«validation.types»: типы, для которых включается проверка типа, пустое означает «нет» («все»)
«validation.tables»: таблицы для включения проверки типа, пустое означает «нет» («все»)
«ipAddress.tables»: таблицы для поиска столбцов, которые нужно переопределить IP-адресом («»)
«ipAddress.columns»: столбцы для защиты и переопределения IP-адреса при создании («»)
"sanitation.handler": Обработчик для реализации правил очистки для входных значений ("")
«sanitation.types»: типы для включения очистки типов, пустое значение означает «нет» («все»)
«sanitation.tables»: Таблицы для включения типа санитарии, пустое означает «нет» («все»)
«multiTenancy.handler»: обработчик для реализации простых правил мультитенантности («»)
«pageLimits.pages»: Максимальное количество страниц, которое позволяет операция списка («100»).
«pageLimits.records»: максимальное количество записей, возвращаемых операцией списка («1000»).
«joinLimits.глубина»: максимальная глубина (длина), разрешенная для пути соединения («3»).
«joinLimits.tables»: максимальное количество столов, к которым вам разрешено присоединиться («10»).
«joinLimits.records»: максимальное количество записей, возвращаемых для объединенной сущности («1000»).
«textSearch.parameter»: имя параметра, используемого для поискового запроса («поиск»).
«customization.beforeHandler»: обработчик для реализации настройки запроса («»)
«customization.afterHandler»: обработчик для реализации настройки ответа («»)
«json.controllers»: контроллеры для обработки строк JSON («records,geojson»).
«json.tables»: таблицы для обработки строк JSON («все»)
«json.columns»: столбцы для обработки строк JSON («все»)
«xml.types»: типы JSON, которые следует добавить к атрибуту типа XML («null,array»).
Если вы не укажете эти параметры в конфигурации, то будут использованы значения по умолчанию (в скобках).
В разделах ниже вы найдете дополнительную информацию о встроенном промежуточном программном обеспечении.
В настоящее время поддерживается пять типов аутентификации. Все они хранят аутентифицированного пользователя в суперглобальном объекте $_SESSION
. Эту переменную можно использовать в обработчиках авторизации, чтобы решить, должен ли кто-то иметь доступ на чтение или запись к определенным таблицам, столбцам или записям. В следующем обзоре показаны типы промежуточного программного обеспечения аутентификации, которые вы можете включить.
Имя | Промежуточное ПО | Аутентифицирован через | Пользователи хранятся в | Переменная сеанса |
---|---|---|---|---|
API-ключ | APIKeyAuth | Заголовок «X-API-Key» | конфигурация | $_SESSION['apiKey'] |
БД ключей API | APIKeyDbAuth | Заголовок «X-API-Key» | таблица базы данных | $_SESSION['apiUser'] |
База данных | дбАут | конечная точка '/login' | таблица базы данных | $_SESSION['user'] |
Базовый | базовая аутентификация | Заголовок «Авторизация» | файл '.htpasswd' | $_SESSION['username'] |
JWT | jwtAuth | Заголовок «Авторизация» | поставщик удостоверений | $_SESSION['claims'] |
Ниже вы найдете дополнительную информацию о каждом из типов аутентификации.
Аутентификация ключа API осуществляется путем отправки ключа API в заголовке запроса. Имя заголовка по умолчанию — «X-API-Key» и может быть настроено с помощью параметра конфигурации «apiKeyAuth.header». Действительные ключи API необходимо настроить с помощью параметра конфигурации apiKeyAuth.keys (список, разделенный запятыми).
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
Аутентифицированный ключ API будет храниться в переменной $_SESSION['apiKey']
.
Обратите внимание, что аутентификация по ключу API не требует и не использует файлы cookie сеанса.
Аутентификация базы данных ключей API осуществляется путем отправки ключа API в заголовке запроса «X-API-Key» (имя настраивается). Действительные ключи API считываются из базы данных из столбца «api_key» таблицы «users» (оба имени настраиваются).
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
Аутентифицированный пользователь (со всеми его свойствами) будет сохранен в переменной $_SESSION['apiUser']
.
Обратите внимание, что аутентификация базы данных ключей API не требует и не использует файлы cookie сеанса.
Промежуточное программное обеспечение аутентификации базы данных определяет пять новых маршрутов:
method path - parameters - description --------------------------------------------------------------------------------------------------- GET /me - - returns the user that is currently logged in POST /register - username, password - adds a user with given username and password POST /login - username, password - logs a user in by username and password POST /password - username, password, newPassword - updates the password of the logged in user POST /logout - - logs out the currently logged in user
Пользователь может войти в систему, отправив свое имя пользователя и пароль на конечную точку входа (в формате JSON). Аутентифицированный пользователь (со всеми его свойствами) будет сохранен в переменной $_SESSION['user']
. Пользователь может выйти из системы, отправив POST-запрос с пустым телом в конечную точку выхода из системы. Пароли хранятся в виде хешей в столбце паролей таблицы пользователей. Вы можете зарегистрировать нового пользователя, используя конечную точку регистрации, но эту функцию необходимо включить с помощью параметра конфигурации «dbAuth.registerUser».
ВАЖНО ограничить доступ к таблице пользователей с помощью промежуточного программного обеспечения «авторизации», иначе все пользователи смогут свободно добавлять, изменять или удалять любую учетную запись! Минимальная конфигурация показана ниже:
'middlewares' => 'dbAuth,authorization', 'authorization.tableHandler' => function ($operation, $tableName) { return $tableName != 'users'; },
Обратите внимание, что это промежуточное программное обеспечение использует файлы cookie сеанса и сохраняет состояние входа в систему на сервере.
Войти, используя представления с объединенной таблицей
Для операций входа в систему можно использовать представление userTable. Такое представление может возвращать отфильтрованный результат из таблицы пользователей, например, где active = true , или оно также может возвращать результат из нескольких таблиц посредством объединения таблиц. Как минимум, представление должно включать имя пользователя и пароль , а также поле с именем id .
Однако представления с объединенными таблицами не подлежат вставке (см. проблему 907). В качестве обходного пути используйте свойство loginTable , чтобы установить другую справочную таблицу для входа в систему. В качестве userTable по-прежнему будет установлена обычная вставляемая таблица пользователей.
Промежуточное программное обеспечение аутентификации Wordpress определяет три маршрута:
method path - parameters - description --------------------------------------------------------------------------------------------------- GET /me - - returns the user that is currently logged in POST /login - username, password - logs a user in by username and password POST /logout - - logs out the currently logged in user
Пользователь может войти в систему, отправив свое имя пользователя и пароль на конечную точку входа (в формате JSON). Пользователь может выйти из системы, отправив POST-запрос с пустым телом в конечную точку выхода из системы. Вам необходимо указать каталог установки Wordpress, используя параметр конфигурации «wpAuth.wpDirectory». Промежуточное программное обеспечение вызывает «wp-load.php», что позволяет вам использовать функции Wordpress в промежуточном программном обеспечении авторизации, например:
wp_get_current_user()
is_user_logged_in()
is_super_admin()
user_can(wp_get_current_user(),'edit_posts');
Обратите внимание, что переменная $_SESSION
не используется этим промежуточным программным обеспечением.
Тип Basic поддерживает файл (по умолчанию «.htpasswd»), в котором хранятся имена пользователей и их (хешированные) пароли, разделенные двоеточием («:»). Когда пароли вводятся в виде обычного текста, они автоматически хешируются. Аутентифицированное имя пользователя будет сохранено в переменной $_SESSION['username']
. Вам необходимо отправить заголовок «Authorization», содержащий версию вашего имени пользователя и пароля, разделенных двоеточиями, в URL-адресе base64 после слова «Basic».
Authorization: Basic dXNlcm5hbWUxOnBhc3N3b3JkMQ
В этом примере отправляется строка «имя пользователя1:пароль1».
Тип JWT требует, чтобы другой сервер (SSO/Identity) подписал токен, содержащий утверждения. Оба сервера имеют общий секрет, поэтому они могут либо подписать, либо проверить подлинность подписи. Утверждения хранятся в переменной $_SESSION['claims']
. Вам необходимо отправить заголовок «X-Authorization», содержащий URL-адрес в кодировке Base64 и разделенный точками заголовок токена, тело и подпись после слова «Носитель» (подробнее о JWT читайте здесь). Стандарт гласит, что вам необходимо использовать заголовок «Авторизация», но это проблематично в Apache и PHP.
X-Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6IjE1MzgyMDc2MDUiLCJleHAiOjE1MzgyMDc2MzV9.Z5px_GT15TRKhJCTHhDt5Z6K6LRDSFnLj8U5ok9l7gw
В этом примере отправляются подписанные утверждения:
{ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": "1538207605", "exp": 1538207635 }
Примечание. Реализация JWT поддерживает только алгоритмы на основе RSA и HMAC.