單一檔案 PHP 腳本,將 REST API 新增至 MySQL/MariaDB、PostgreSQL、SQL Server 或 SQLite 資料庫。
操作方法:將「 api.php
」上傳到您的網頁伺服器,將其配置為連接到您的資料庫,並擁有即時的全功能 REST API。
注意:這是 PHP 中的 TreeQL 參考實作。
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 的內建 Web 伺服器:
php -S localhost:8080
透過開啟以下 URL 來測試腳本:
http://localhost:8080/api.php/records/posts/1
不要忘記修改文件底部的配置。
或者,您可以將此項目整合到您選擇的 Web 框架中,請參閱:
Laravel 的自動 REST API
Symfony 4 的自動 REST API
SlimPHP 4 的自動 REST API
在這些整合中,Composer 用於將此專案作為依賴項載入。
對於不使用 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
)
「address」:資料庫伺服器的主機名稱(或檔案名稱)( localhost
)
「port」:資料庫伺服器的TCP連接埠(預設為驅動程式預設連接埠)
「username」:連接資料庫的使用者的使用者名稱(無預設)
「password」:連接資料庫的使用者密碼(無預設)
“database”:連接的資料庫(無預設值)
「command」:用於初始化資料庫連線的額外 SQL(無)
「tables」:以逗號分隔的要發布的表格清單(預設為「all」)
“mapping”:逗號分隔的表/列映射清單(無映射)
「geometrySrid」:從 WKT 轉換為幾何時假定的 SRID ( 4326
)
“middlewares”:要載入的中間件清單( cors
)
「controllers」:要載入的控制器清單( 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」:API 的 URI 基本路徑(預設使用 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 支援的空間/GIS 欄位和過濾器
映射表和列名稱以支援遺留系統
使用 OpenAPI 工具產生 API 文件
透過 API 金鑰、JWT 令牌或使用者名稱/密碼進行身份驗證
資料庫連線參數可能取決於身份驗證
支援讀取 JSON 格式的資料庫結構
支援使用 REST 端點修改資料庫結構
包含安全性增強中介軟體
符合標準:PSR-4、PSR-7、PSR-12、PSR-15 和 PSR-17
相關項目:
PHP-CRUD-API 快速入門:一個可自訂、隨時可用的 docker compose 文件,具有 PHP-CRUD-API。
PHP-CRUD-API 過濾器產生器:一個 JavaScript 函式庫,從表達式建立 PHP-CRUD-API 過濾器。
JS-CRUD-API:PHP-CRUD-API API 的 JavaScript 用戶端程式庫
PHP-API-AUTH:單一檔案 PHP 腳本,是 PHP-CRUD-API 的驗證提供者
PHP-CRUD-UI:將 UI 新增至 PHP-CRUD-API 專案的單一檔案 PHP 腳本。
PHP-CRUD-ADMIN:單一檔案 PHP 腳本,將資料庫管理介面新增至 PHP-CRUD-API 專案。
PHP-SP-API:將 REST API 新增至 SQL 資料庫的單一檔案 PHP 腳本。
dexie-mysql-sync:本機IndexedDB和MySQL資料庫之間的同步。
ra-data-treeql:NPM 包,為 React Admin 提供資料提供者。
scriptPilot/vueuse:除了 VueUse.org(支援 PHP-CRUD-API)之外的 Vue 可組合項。
scriptPilot/add-php-backend:將 MySQL、phpMyAdmin 和 PHP-CRUD-API 加入您的開發環境。
VUE-CRUD-UI:單一檔案 Vue.js 腳本,將 UI 新增至 PHP-CRUD-API 專案。
該腳本也有連接埠:
Go-CRUD-API(正在進行中)
Java JDBC 作者:Ivan Kolchagov (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 以更新依賴項。
注意:更新腳本將修補供應商目錄中的依賴項以實現 PHP 7.0 相容性。
TreeQL 可讓您根據 SQL 資料庫結構(關係)和查詢建立 JSON 物件「樹」。
它大致基於 REST 標準,並受到 json:api 的啟發。
範例 posts 表只有幾個欄位:
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」值)
您可以透過在前面加上「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 中重複「filter」參數來套用篩選器。例如以下網址:
GET /records/categories?filter=id,gt,1&filter=id,lt,3
將請求所有類別「其中 id > 1 且 id < 3」。如果你想要「where id = 2 or id = 4」你應該寫:
GET /records/categories?filter1=id,eq,2&filter2=id,eq,4
正如您所看到的,我們在“filter”參數中添加了一個數字,以指示應應用“OR”而不是“AND”。請注意,您也可以重複“filter1”並在“OR”內建立“AND”。由於您還可以透過添加字母 (af) 來更深入一層,因此您可以創建幾乎任何相當複雜的條件樹。
注意:您只能對請求的表(不能對其包含的表)進行過濾,並且過濾器僅應用於清單呼叫。
預設情況下,所有列均被選取。使用“include”參數,您可以選擇特定的列。您可以使用點來分隔表名和列名。多列應以逗號分隔。星號(“*”)可以用作通配符來指示“所有列”。與“包含”類似,您可以使用“排除”參數來刪除某些列:
GET /records/categories/1?include=name GET /records/categories/1?include=categories.name GET /records/categories/1?exclude=categories.id
輸出:
{ "name": "Internet" }
注意:用於包含相關實體的列會自動新增,且不能從輸出中省略。
使用“order”參數您可以排序。預設情況下,排序按升序排列,但透過指定“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" } ] }
注意:您可以使用多個“order”參數對多個欄位進行排序。您無法對「連線」列進行排序。
“size”參數限制傳回記錄的數量。這可以與“order”參數一起用於前 N 個清單(使用降序)。
GET /records/categories?order=id,desc&size=1
輸出:
{ "records":[ { "id": 3 "name": "Web development" } ] }
注意:如果您也想知道記錄總數,您可能需要使用“page”參數。
“page”參數保存所要求的頁面。預設頁面大小為 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、belongsTo 和 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”:空間相等(幾何形狀等於另一個)
「sin」:空間相交(幾何與另一個相交)
「sov」:空間重疊(幾何重疊另一個)
「sto」:空間接觸(幾何接觸另一個)
「swi」:空間內部(幾何圖形在另一個幾何圖形內部)
「sic」:空間是封閉的(幾何是封閉且簡單的)
「sis」:空間簡單(幾何簡單)
「siv」:空間有效(幾何有效)
這些過濾器基於 OGC 標準,並且表示幾何列的 WKT 規格也是如此。請注意,從 WKT 轉換為幾何時假定的 SRID 由配置變數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
」端點並繼承所有功能,例如連接和過濾器。它還支援“幾何”參數來指示幾何列的名稱,以防表有多個幾何列。對於地圖視圖,它支援“bbox”參數,您可以在其中指定左上角和右下角座標(以逗號分隔)。 GeoJSON 實作支援以下幾何類型:
觀點
多點
線串
多行字串
多邊形
多重多邊形
GeoJSON 功能預設為啟用,但可以使用「控制器」配置停用。
為了支援為遺留系統(例如 Wordpress)(的一部分)建立 API,您可能需要對應表和列名稱,因為如果不更改軟體就無法改進它們,而名稱可能需要進行一些改進以保持一致性。此配置允許您使用逗號分隔的映射清單重新命名表和列,這些映射以等號分隔,如下所示:
'mapping' => 'wp_posts=posts,wp_posts.ID=posts.id',
此特定範例將在「 posts
」端點(而不是「 wp_posts
」)公開「 wp_posts
」表,並將該表中的「 ID
」列公開為「 id
」屬性(小寫而不是大寫)。
注意:由於這兩個映射重疊,因此可以省略第一個(不太具體)映射。
您可以使用「middlewares」設定參數啟用下列中間件:
「防火牆」:限制對特定IP位址的訪問
「sslRedirect」:強制透過 HTTPS 而不是 HTTP 進行連接
「cors」:支援 CORS 請求(預設啟用)
“xsrf”:使用“雙重提交 Cookie”方法阻止 XSRF 攻擊
“ajaxOnly”:限制非AJAX請求以防止XSRF攻擊
“apiKeyAuth”:支援“API密鑰身份驗證”
“apiKeyDbAuth”:支援“API密鑰資料庫身份驗證”
“dbAuth”:支援“資料庫身份驗證”
“wpAuth”:支援“Wordpress 身份驗證”
“jwtAuth”:支援“JWT 身份驗證”
“basicAuth”:支援“基本身份驗證”
“reconnect”:使用不同的參數重新連接資料庫
“authorization”:限制對某些表或列的訪問
“validation”:傳回自訂規則和預設類型規則的輸入驗證錯誤
「ipAddress」:使用建立時的 IP 位址填入受保護字段
「sanitation」:在創建和更新時應用輸入衛生
“multiTenancy”:限制多租戶場景中的租戶訪問
“pageLimits”:限制清單操作以防止資料庫抓取
“joinLimits”:限制連線參數以防止資料庫抓取
“textSearch”:使用簡單參數在所有文字欄位中搜尋
「customization」:提供請求和回應客製化的處理程序
“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」:XSRF 保護 cookie 的名稱(「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”:用於儲存使用者的表(“users”)
「apiKeyDbAuth.apiKeyColumn」:儲存 API 金鑰(「api_key」)的使用者表列
「dbAuth.mode」:如果您想允許匿名訪問,則設定為「可選」(「必需」)
「dbAuth.usersTable」:用於儲存使用者的表(「users」)
「dbAuth.loginTable」:用於擷取登入使用者資訊(「users」)的表或視圖
“dbAuth.usernameColumn”:儲存使用者名稱的使用者表列(“username”)
「dbAuth.passwordColumn」:儲存密碼的使用者表列(「password」)
“dbAuth.returnedColumns”:登入成功時傳回的列,空表示「全部」(「」)
「dbAuth.usernameFormField」:儲存使用者名稱的表單欄位的名稱(「username」)
「dbAuth.passwordFormField」:儲存密碼的表單欄位的名稱(「password」)
「dbAuth.newPasswordFormField」:儲存新密碼的表單欄位的名稱(「newPassword」)
「dbAuth.registerUser」:JSON 使用者資料(或「1」),以防您希望啟用 /register 端點(「」)
"dbAuth.loginAfterRegistration":如果註冊用戶應在註冊後登錄,則為 1 或零 ("")
「dbAuth.passwordLength」:密碼必須具有的最小長度(「12」)
“dbAuth.sessionName”:啟動的 PHP 會話的名稱(“”)
“wpAuth.mode”:如果您想允許匿名訪問,則設定為“可選”(“必需”)
「wpAuth.wpDirectory」:可以找到 WordPress 安裝的資料夾/路徑(「.」)
“wpAuth.usernameFormField”:儲存使用者名稱的表單欄位的名稱(“username”)
「wpAuth.passwordFormField」:儲存密碼的表單欄位的名稱(「password」)
“jwtAuth.mode”:如果您想允許匿名訪問,則設定為“可選”(“必需”)
「jwtAuth.header」:包含 JWT 令牌的標頭名稱(「X-Authorization」)
「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.depth”:連接路徑中允許的最大深度(長度)(“3”)
「joinLimits.tables」:允許您加入的最大表數(「10」)
「joinLimits.records」:為連線實體傳回的最大記錄數(「1000」)
「textSearch.parameter」:用於搜尋字詞(「搜尋」)的參數名稱
“customization.beforeHandler”:實作請求自訂的Handler(“”)
「customization.afterHandler」:實作回應客製化的處理程序(「」)
「json.controllers」:處理 JSON 字串的控制器(「records,geojson」)
“json.tables”:處理 JSON 字串的表(“all”)
“json.columns”:處理 JSON 字串的列(“all”)
“xml.types”:應新增至 XML 類型屬性的 JSON 類型(“null,array”)
如果您未在組態中指定這些參數,則使用預設值(括號之間)。
在下面的部分中,您可以找到有關內建中間件的更多資訊。
目前支援五種類型的身份驗證。它們都將經過驗證的使用者儲存在$_SESSION
超級全域中。該變數可以在授權處理程序中使用來決定某人是否應該具有對某些表、列或記錄的讀取或寫入存取權限。以下概述顯示了您可以啟用的身份驗證中間件類型。
姓名 | 中介軟體 | 認證通過 | 用戶儲存在 | 會話變數 |
---|---|---|---|---|
API金鑰 | apiKey認證 | “X-API-Key”標頭 | 配置 | $_SESSION['apiKey'] |
API金鑰資料庫 | apiKeyDbAuth | “X-API-Key”標頭 | 資料庫表 | $_SESSION['apiUser'] |
資料庫 | 資料庫驗證 | '/login' 端點 | 資料庫表 | $_SESSION['user'] |
基本的 | 基本驗證 | 「授權」標頭 | “.htpasswd”文件 | $_SESSION['username'] |
智威湯遜 | jwtAuth | 「授權」標頭 | 身分提供者 | $_SESSION['claims'] |
您可以在下面找到有關每種身份驗證類型的更多資訊。
API 金鑰驗證透過在請求標頭中傳送 API 金鑰來進行。標頭名稱預設為“X-API-Key”,可以使用“apiKeyAuth.header”配置參數進行配置。必須使用「apiKeyAuth.keys」設定參數(逗號分隔清單)來設定有效的 API 金鑰。
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
經過驗證的 API 金鑰將儲存在$_SESSION['apiKey']
變數中。
請注意,API 金鑰驗證不需要或使用會話 cookie。
API 金鑰資料庫驗證是透過在請求標頭「X-API-Key」(名稱可設定)中傳送 API 金鑰來進行。有效的 API 金鑰是從資料庫的「users」表的「api_key」欄位中讀取的(兩個名稱都是可設定的)。
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 並將登入狀態儲存在伺服器上。
使用具有連接表的視圖登入
對於登入操作,可以使用視圖作為 usersTable。這樣的視圖可以從使用者表返回過濾結果,例如,其中active = true ,或者它也可以透過表連接傳回多個表的結果。該視圖至少應包含使用者名稱和密碼以及名為id 的欄位。
但是,具有連接表的視圖不可插入(請參閱問題 907)。作為解決方法,請使用屬性loginTable為登入設定不同的參考表。 usersTable仍將設定為普通的可插入使用者表。
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 請求來註銷。您需要使用「wpAuth.wpDirectory」設定參數指定Wordpress安裝目錄。中間件呼叫“wp-load.php”,這允許您在授權中間件中使用 Wordpress 功能,例如:
wp_get_current_user()
is_user_logged_in()
is_super_admin()
user_can(wp_get_current_user(),'edit_posts');
請注意,該中間件不使用$_SESSION
變數。
基本類型支援一個檔案(預設為“.htpasswd”),該檔案保存使用者及其(雜湊)密碼,並以冒號(“:”)分隔。當密碼以純文字形式輸入時,它們將自動散列。經過驗證的使用者名稱將儲存在$_SESSION['username']
變數中。您需要在「Basic」一詞之後發送一個「Authorization」標頭,其中包含冒號分隔的使用者名稱和密碼的 base64 url 編碼版本。
Authorization: Basic dXNlcm5hbWUxOnBhc3N3b3JkMQ
此範例傳送字串“username1:password1”。
JWT 類型需要另一個(SSO/身分)伺服器來簽署包含聲明的令牌。兩台伺服器共用一個秘密,以便它們可以簽名或驗證簽名是否有效。宣告儲存在$_SESSION['claims']
變數中。您需要發送一個“X-Authorization”標頭,其中包含base64 url 編碼和點分隔的令牌標頭、正文和“Bearer”一詞後面的簽名(請在此處閱讀有關JWT 的更多信息)。標準規定您需要使用「Authorization」標頭,但這在 Apache 和 PHP 中是有問題的。
X-Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6IjE1MzgyMDc2MDUiLCJleHAiOjE1MzgyMDc2MzV9.Z5px_GT15TRKhJCTHhDt5Z6K6LRDSFnLj8U5ok9l7gw
此範例發送簽署的聲明:
{ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": "1538207605", "exp": 1538207635 }
注意:JWT 實作僅支援基於 RSA 和 HMAC 的演算法。