Skrip PHP file tunggal yang menambahkan REST API ke database MySQL/MariaDB, PostgreSQL, SQL Server, atau SQLite.
Caranya: Unggah " api.php
" ke server web Anda, konfigurasikan agar terhubung ke database Anda, dapatkan REST API berfitur lengkap secara instan.
NB: Ini adalah implementasi referensi TreeQL di PHP.
PHP 7.2 atau lebih tinggi dengan driver PDO diaktifkan untuk salah satu sistem database berikut:
MySQL 5.7 / MariaDB 10.0 atau lebih tinggi untuk fitur spasial di MySQL
PostgreSQL 9.5 atau lebih tinggi dengan PostGIS 2.2 atau lebih tinggi untuk fitur spasial
SQL Server 2017 atau lebih tinggi (2019 juga memiliki dukungan Linux)
SQLite 3.16 atau lebih tinggi (fitur spasial TIDAK didukung)
Unduh file " api.php
" dari rilis terbaru:
https://github.com/mevdschee/php-crud-api/releases/latest atau langsung dari:
https://raw.githubusercontent.com/mevdschee/php-crud-api/main/api.php
Ini adalah aplikasi file tunggal! Unggah " api.php
" di suatu tempat dan nikmatilah!
Untuk pengembangan lokal, Anda dapat menjalankan server web bawaan PHP:
php -S localhost:8080
Uji skrip dengan membuka URL berikut:
http://localhost:8080/api.php/records/posts/1
Jangan lupa untuk mengubah konfigurasi di bagian bawah file.
Alternatifnya, Anda dapat mengintegrasikan proyek ini ke dalam kerangka web pilihan Anda, lihat:
REST API otomatis untuk Laravel
REST API otomatis untuk Symfony 4
API REST otomatis untuk SlimPHP 4
Dalam integrasi ini Komposer digunakan untuk memuat proyek ini sebagai ketergantungan.
Bagi yang tidak menggunakan composer, disediakan file " api.include.php
". File ini berisi semuanya mulai dari " api.php
" kecuali konfigurasi dari " src/index.php
" dan dapat digunakan oleh fungsi "include" PHP.
Edit baris berikut di bagian bawah file " api.php
":
$config = new Config([ 'username' => 'xxx', 'password' => 'xxx', 'database' => 'xxx', ]);
Ini semua opsi konfigurasi dan nilai defaultnya di antara tanda kurung:
"driver": mysql
, pgsql
, sqlsrv
atau sqlite
( mysql
)
"alamat": Nama host (atau nama file) dari server database ( localhost
)
"port": Port TCP dari server database (default ke default driver)
"nama pengguna": Nama pengguna pengguna yang terhubung ke database (tidak ada default)
"password": Kata sandi pengguna yang terhubung ke database (tidak ada default)
"database": Database tempat koneksi dibuat (tidak ada default)
"command": SQL ekstra untuk menginisialisasi koneksi database (tidak ada)
"tabel": Daftar tabel yang dipisahkan koma untuk dipublikasikan (defaultnya adalah 'semua')
"pemetaan": Daftar pemetaan tabel/kolom yang dipisahkan koma (tidak ada pemetaan)
"geometrySrid": SRID diasumsikan saat mengkonversi dari WKT ke geometri ( 4326
)
"middlewares": Daftar middleware yang akan dimuat ( cors
)
"pengendali": Daftar pengontrol yang akan dimuat ( records,geojson,openapi,status
)
"customControllers": Daftar pengontrol khusus pengguna yang akan dimuat (tidak ada default)
"openApiBase": Info OpenAPI ( {"info":{"title":"PHP-CRUD-API","version":"1.0.0"}}
)
"cacheType": TempFile
, Redis
, Memcache
, Memcached
atau NoCache
( TempFile
)
"cachePath": Jalur/alamat cache (default pada direktori temp sistem)
"cacheTime": Jumlah detik cache valid ( 10
)
"jsonOptions": Opsi yang digunakan untuk pengkodean JSON ( JSON_UNESCAPED_UNICODE
)
"debug": Tampilkan kesalahan di header "X-Exception" ( false
)
"basePath": jalur dasar URI API (ditentukan menggunakan PATH_INFO secara default)
Semua opsi konfigurasi juga tersedia sebagai variabel lingkungan. Tulis opsi konfigurasi dengan huruf kapital, awalan "PHP_CRUD_API_" dan garis bawah untuk pemutusan kata, misalnya:
PHP_CRUD_API_DRIVER=mysql
PHP_CRUD_API_ADDRESS=host lokal
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
Variabel lingkungan lebih diutamakan daripada konfigurasi PHP.
Batasan dan kendala ini berlaku:
Kunci utama harus berupa kenaikan otomatis (dari 1 hingga 2^53) atau UUID
Kunci asing primer dan komposit komposit tidak didukung
Penulisan kompleks (transaksi) tidak didukung
Fungsi panggilan kueri kompleks (seperti "concat" atau "sum") tidak didukung
Basis data harus mendukung dan mendefinisikan batasan kunci asing
SQLite tidak dapat mengetikkan kunci utama penambahan otomatis bigint
SQLite tidak mendukung perubahan kolom tabel (struktur)
Fitur-fitur berikut ini didukung:
Instalasi komposer atau file PHP tunggal, mudah diterapkan.
Kode yang sangat sedikit, mudah diadaptasi dan dipelihara
Mendukung variabel POST sebagai input (x-www-form-urlencoded)
Mendukung objek JSON sebagai input
Mendukung array JSON sebagai input (penyisipan batch)
Sanitasi dan validasi input menggunakan aturan tipe dan callback
Sistem izin untuk database, tabel, kolom dan catatan
Tata letak database tunggal dan multi-penyewa multi-penyewa didukung
Dukungan CORS multi-domain untuk permintaan lintas domain
Dukungan untuk membaca hasil gabungan dari beberapa tabel
Cari dukungan pada berbagai kriteria
Paginasi, pengurutan, daftar N teratas, dan pemilihan kolom
Deteksi relasi dengan hasil bersarang (belongsTo, hasMany dan HABTM)
Dukungan kenaikan atom melalui PATCH (untuk penghitung)
Bidang biner didukung dengan pengkodean base64
Bidang dan filter spasial/GIS didukung dengan WKT dan GeoJSON
Memetakan nama tabel dan kolom untuk mendukung sistem lama
Hasilkan dokumentasi API menggunakan alat OpenAPI
Otentikasi melalui kunci API, token JWT atau nama pengguna/kata sandi
Parameter koneksi database mungkin bergantung pada otentikasi
Dukungan untuk membaca struktur database di JSON
Dukungan untuk memodifikasi struktur database menggunakan titik akhir REST
Middleware peningkatan keamanan disertakan
Sesuai standar: PSR-4, PSR-7, PSR-12, PSR-15 dan PSR-17
Proyek terkait:
Mulai Cepat PHP-CRUD-API: File penulisan buruh pelabuhan yang dapat disesuaikan dan siap digunakan yang menampilkan PHP-CRUD-API.
Generator filter PHP-CRUD-API: Pustaka JavaScript yang membuat filter PHP-CRUD-API dari ekspresi.
JS-CRUD-API: Pustaka klien JavaScript untuk API PHP-CRUD-API
PHP-API-AUTH: Skrip PHP file tunggal yang merupakan penyedia otentikasi untuk PHP-CRUD-API
PHP-CRUD-UI: Skrip PHP file tunggal yang menambahkan UI ke proyek PHP-CRUD-API.
PHP-CRUD-ADMIN: Skrip PHP file tunggal yang menambahkan antarmuka admin database ke proyek PHP-CRUD-API.
PHP-SP-API: Skrip PHP file tunggal yang menambahkan REST API ke database SQL.
dexie-mysql-sync: Sinkronisasi antara IndexedDB lokal dan Database MySQL.
ra-data-treeql: Paket NPM yang menyediakan Penyedia Data untuk React Admin.
scriptPilot/vueuse: Vue Composables selain VueUse.org (yang mendukung PHP-CRUD-API).
scriptPilot/add-php-backend: Tambahkan MySQL, phpMyAdmin dan PHP-CRUD-API ke lingkungan dev Anda.
VUE-CRUD-UI: File tunggal skrip Vue.js yang menambahkan UI ke proyek PHP-CRUD-API.
Ada juga port skrip ini di:
Go-CRUD-API (sedang dalam proses)
Java JDBC oleh Ivan Kolchagov (v1)
Java Spring Boot + jOOQ (v2: sedang dalam proses)
Ada juga port bukti konsep skrip ini yang hanya mendukung fungsionalitas dasar REST CRUD di: PHP, Java, Go, C# .net core, Node.js, dan Python.
Anda dapat menginstal semua dependensi proyek ini menggunakan perintah berikut:
php install.php
Anda dapat mengkompilasi semua file menjadi satu file " api.php
" menggunakan:
php build.php
Perhatikan bahwa Anda tidak menggunakan kompilasi saat mengintegrasikan proyek ini ke proyek atau kerangka kerja lain (sebagai gantinya gunakan Komposer).
Anda dapat mengakses kode yang tidak dikompilasi di URL:
http://localhost:8080/src/records/posts/1
Kode yang tidak dikompilasi berada di direktori " src
" dan " vendor
". Direktori " vendor
" berisi dependensi.
Anda dapat memperbarui semua dependensi proyek ini menggunakan perintah berikut:
php update.php
Skrip ini akan menginstal dan menjalankan Komposer untuk memperbarui dependensi.
NB: Skrip pembaruan akan menambal dependensi di direktori vendor untuk kompatibilitas PHP 7.0.
TreeQL memungkinkan Anda membuat "pohon" objek JSON berdasarkan struktur database SQL (relasi) dan kueri Anda.
Ini secara longgar didasarkan pada standar REST dan juga terinspirasi oleh json:api.
Tabel contoh posting hanya memiliki beberapa bidang:
posts ======= id title content created
Operasi CRUD + Daftar di bawah ini berlaku pada tabel ini.
Jika ingin membuat record request dapat ditulis dalam format URL seperti:
POST /records/posts
Anda harus mengirimkan badan yang berisi:
{ "title": "Black is the new red", "content": "This is the second post.", "created": "2018-03-06T21:34:01Z" }
Dan itu akan mengembalikan nilai kunci utama dari catatan yang baru dibuat:
2
Untuk membaca record dari tabel ini permintaan dapat ditulis dalam format URL sebagai:
GET /records/posts/1
Dimana “1” adalah nilai kunci utama dari record yang ingin dibaca. Ini akan mengembalikan:
{ "id": 1 "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" }
Pada operasi baca, Anda dapat menerapkan gabungan.
Untuk mengupdate record pada tabel ini permintaan dapat ditulis dalam format URL sebagai:
PUT /records/posts/1
Dimana "1" adalah nilai kunci utama dari rekaman yang ingin Anda perbarui. Kirim sebagai badan:
{ "title": "Adjusted title!" }
Ini menyesuaikan judul postingan. Dan nilai yang dikembalikan adalah jumlah baris yang ditetapkan:
1
Jika Anda ingin menghapus record dari tabel ini permintaan dapat ditulis dalam format URL sebagai:
DELETE /records/posts/1
Dan itu akan mengembalikan jumlah baris yang dihapus:
1
Untuk membuat daftar record dari tabel ini permintaan dapat ditulis dalam format URL sebagai:
GET /records/posts
Ini akan mengembalikan:
{ "records":[ { "id": 1, "title": "Hello world!", "content": "Welcome to the first post.", "created": "2018-03-05T20:12:56Z" } ] }
Pada operasi daftar, Anda dapat menerapkan filter dan gabungan.
Filter menyediakan fungsionalitas pencarian, pada panggilan daftar, menggunakan parameter "filter". Anda perlu menentukan nama kolom, koma, jenis pencocokan, koma lain, dan nilai yang ingin Anda filter. Ini adalah jenis pencocokan yang didukung:
"cs": berisi string (string berisi nilai)
"sw": dimulai dengan (string dimulai dengan nilai)
"ew": diakhiri dengan (string diakhiri dengan nilai)
"eq": sama (string atau angka sama persis)
"lt": lebih rendah dari (angka lebih rendah dari nilai)
"le": lebih rendah atau sama (angka lebih rendah atau sama dengan nilai)
"ge": lebih besar atau sama (angka lebih tinggi atau sama dengan nilai)
"gt": lebih besar dari (angka lebih tinggi dari nilai)
"bt": antara (angka berada di antara dua nilai yang dipisahkan koma)
"in": in (angka atau string berada dalam daftar nilai yang dipisahkan koma)
"is": adalah null (bidang berisi nilai "NULL")
Anda dapat meniadakan semua filter dengan menambahkan karakter "n", sehingga "eq" menjadi "neq". Contoh penggunaan filter adalah:
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
Keluaran:
{ "records":[ { "id": 1 "name": "Internet" } ] }
Di bagian selanjutnya kita akan mendalami lebih dalam bagaimana Anda dapat menerapkan beberapa filter pada satu panggilan daftar.
Filter dapat diterapkan dengan mengulangi parameter "filter" di URL. Misalnya URL berikut:
GET /records/categories?filter=id,gt,1&filter=id,lt,3
akan meminta semua kategori "di mana id > 1 dan id <3". Jika Anda menginginkan "di mana id = 2 atau id = 4" Anda harus menulis:
GET /records/categories?filter1=id,eq,2&filter2=id,eq,4
Seperti yang Anda lihat, kami menambahkan angka ke parameter "filter" untuk menunjukkan bahwa "ATAU" dan bukan "DAN" harus diterapkan. Perhatikan bahwa Anda juga dapat mengulangi "filter1" dan membuat "DAN" di dalam "ATAU". Karena Anda juga dapat melangkah lebih dalam dengan menambahkan huruf (af), Anda dapat membuat hampir semua pohon kondisi yang cukup rumit.
NB: Anda hanya dapat memfilter pada tabel yang diminta (bukan pada tabel yang disertakan) dan filter hanya diterapkan pada panggilan daftar.
Secara default, semua kolom dipilih. Dengan parameter "sertakan" Anda dapat memilih kolom tertentu. Anda dapat menggunakan titik untuk memisahkan nama tabel dari nama kolom. Beberapa kolom harus dipisahkan koma. Tanda bintang ("*") dapat digunakan sebagai wildcard untuk menunjukkan "semua kolom". Mirip dengan "sertakan" Anda dapat menggunakan parameter "kecualikan" untuk menghapus kolom tertentu:
GET /records/categories/1?include=name GET /records/categories/1?include=categories.name GET /records/categories/1?exclude=categories.id
Keluaran:
{ "name": "Internet" }
NB: Kolom yang digunakan untuk memasukkan entitas terkait otomatis ditambahkan dan tidak dapat dikeluarkan dari output.
Dengan parameter "pesanan" Anda dapat mengurutkan. Secara default pengurutan berada dalam urutan menaik, tetapi dengan menentukan "desc" hal ini dapat dibalik:
GET /records/categories?order=name,desc GET /records/categories?order=id,desc&order=name
Keluaran:
{ "records":[ { "id": 3 "name": "Web development" }, { "id": 1 "name": "Internet" } ] }
NB: Anda dapat mengurutkan beberapa bidang dengan menggunakan beberapa parameter "urutan". Anda tidak dapat memesan pada kolom "bergabung".
Parameter "ukuran" membatasi jumlah rekaman yang dikembalikan. Ini dapat digunakan untuk N daftar teratas bersama dengan parameter "urutan" (gunakan urutan menurun).
GET /records/categories?order=id,desc&size=1
Keluaran:
{ "records":[ { "id": 3 "name": "Web development" } ] }
NB: Jika Anda juga ingin mengetahui jumlah total record, Anda mungkin ingin menggunakan parameter "halaman".
Parameter "halaman" menampung halaman yang diminta. Ukuran halaman default adalah 20, namun dapat disesuaikan (misalnya menjadi 50).
GET /records/categories?order=id&page=1 GET /records/categories?order=id&page=1,50
Keluaran:
{ "records":[ { "id": 1 "name": "Internet" }, { "id": 3 "name": "Web development" } ], "results": 2 }
Elemen "hasil" menampung jumlah total catatan dalam tabel, yang akan dikembalikan jika tidak ada penomoran halaman yang digunakan.
NB: Karena halaman yang tidak diurutkan tidak dapat diberi nomor halaman, halaman akan diurutkan berdasarkan kunci utama.
Katakanlah Anda memiliki tabel postingan yang memiliki komentar (dibuat oleh pengguna) dan postingan dapat memiliki tag.
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
Saat Anda ingin membuat daftar postingan dengan komentar pengguna dan tag, Anda dapat meminta dua jalur "pohon":
posts -> comments -> users posts -> post_tags -> tags
Jalur ini memiliki root yang sama dan permintaan ini dapat ditulis dalam format URL sebagai:
GET /records/posts?join=comments,users&join=tags
Di sini Anda diperbolehkan untuk mengabaikan tabel perantara yang mengikat postingan ke tag. Dalam contoh ini Anda melihat ketiga tipe relasi tabel (hasMany, milikTo dan hasAndBelongsToMany) berlaku:
"postingan" memiliki banyak "komentar"
"komentar" milik "pengguna"
"postingan" memiliki dan dimiliki oleh banyak "tag"
Hal ini dapat menghasilkan data JSON berikut:
{ "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" } ] } ] }
Anda melihat bahwa hubungan "belongsTo" terdeteksi dan nilai kunci asing digantikan oleh objek yang direferensikan. Dalam kasus "hasMany" dan "hasAndBelongsToMany" nama tabel digunakan sebagai properti baru pada objek.
Saat Anda ingin membuat, membaca, memperbarui, atau menghapus, Anda dapat menentukan beberapa nilai kunci utama di URL. Anda juga perlu mengirim array alih-alih objek di badan permintaan untuk membuat dan memperbarui.
Untuk membaca record dari tabel ini permintaan dapat ditulis dalam format URL sebagai:
GET /records/posts/1,2
Hasilnya mungkin:
[ { "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" } ]
Demikian pula ketika Anda ingin melakukan pembaruan batch, permintaan dalam format URL ditulis sebagai:
PUT /records/posts/1,2
Dimana "1" dan "2" adalah nilai kunci utama rekaman yang ingin Anda perbarui. Badan harus berisi jumlah objek yang sama dengan jumlah kunci utama di URL:
[ { "title": "Adjusted title for ID 1" }, { "title": "Adjusted title for ID 2" } ]
Ini menyesuaikan judul postingan. Dan nilai yang dikembalikan adalah jumlah baris yang ditetapkan:
[1,1]
Artinya ada dua operasi pembaruan dan masing-masing operasi tersebut menetapkan satu baris. Operasi batch menggunakan transaksi database, sehingga semuanya berhasil atau gagal (yang berhasil dibatalkan). Jika gagal, isi dokumen akan berisi daftar dokumen kesalahan. Dalam respons berikut, operasi pertama berhasil dan operasi kedua dari batch gagal karena pelanggaran integritas:
[ { "code": 0, "message": "Success" }, { "code": 1010, "message": "Data integrity violation" } ]
Kode status respons akan selalu 424 (ketergantungan gagal) jika terjadi kegagalan pada salah satu operasi batch.
Untuk memasukkan beberapa record ke dalam tabel ini permintaan dapat ditulis dalam format URL sebagai:
POST /records/posts
Badan harus berisi array catatan yang akan disisipkan:
[ { "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" } ]
Nilai yang dikembalikan juga berupa larik yang berisi kunci utama dari rekaman yang baru disisipkan:
[1,2]
Perhatikan bahwa operasi batch untuk DELETE mengikuti pola yang sama seperti PUT, tetapi tanpa isi.
Untuk dukungan spasial, terdapat serangkaian filter tambahan yang dapat diterapkan pada kolom geometri dan dimulai dengan "s":
"sco": isi spasial (geometri berisi yang lain)
"scr": persilangan spasial (geometri melintasi yang lain)
"sdi": keterputusan spasial (geometri terputus-putus dari yang lain)
"seq": spasial sama (geometri sama dengan yang lain)
"dosa": perpotongan spasial (geometri berpotongan dengan yang lain)
"sov": tumpang tindih spasial (geometri tumpang tindih dengan yang lain)
"sto": sentuhan spasial (geometri menyentuh yang lain)
"swi": spasial di dalam (geometri ada di dalam yang lain)
"sic": spasial tertutup (geometri tertutup dan sederhana)
"sis": spasial itu sederhana (geometri itu sederhana)
"siv": spasial valid (geometri valid)
Filter ini didasarkan pada standar OGC dan begitu pula spesifikasi WKT yang mewakili kolom geometri. Perhatikan bahwa SRID yang diasumsikan ketika mengkonversi dari WKT ke geometri ditentukan oleh variabel konfigurasi geometrySrid
dan defaultnya adalah 4326 (WGS 84).
Dukungan GeoJSON adalah tampilan read-only pada tabel dan catatan dalam format GeoJSON. Permintaan ini didukung:
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
Titik akhir " /geojson
" menggunakan titik akhir " /records
" secara internal dan mewarisi semua fungsi, seperti gabungan dan filter. Ini juga mendukung parameter "geometri" untuk menunjukkan nama kolom geometri jika tabel memiliki lebih dari satu. Untuk tampilan peta, ini mendukung parameter "bbox" di mana Anda dapat menentukan koordinat kiri atas dan kanan bawah (dipisahkan koma). Tipe Geometri berikut didukung oleh implementasi GeoJSON:
Titik
MultiTitik
LineString
MultiLineString
Poligon
MultiPoligon
Fungsionalitas GeoJSON diaktifkan secara default, tetapi dapat dinonaktifkan menggunakan konfigurasi "pengontrol".
Untuk mendukung pembuatan API untuk (bagian dari) sistem lama (seperti Wordpress), Anda mungkin ingin memetakan nama tabel dan kolom karena tidak dapat memperbaikinya tanpa mengubah perangkat lunak, sementara nama tersebut mungkin memerlukan beberapa perbaikan untuk konsistensi. Konfigurasi ini memungkinkan Anda mengganti nama tabel dan kolom dengan daftar pemetaan yang dipisahkan koma yang dipisahkan dengan tanda sama dengan, seperti ini:
'mapping' => 'wp_posts=posts,wp_posts.ID=posts.id',
Contoh spesifik ini akan menampilkan tabel " wp_posts
" pada titik akhir " posts
" (bukan " wp_posts
") dan kolom " ID
" di dalam tabel tersebut sebagai properti " id
" (dalam huruf kecil, bukan huruf besar).
NB: Karena kedua pemetaan ini tumpang tindih, maka pemetaan pertama (yang kurang spesifik) dapat dihilangkan.
Anda dapat mengaktifkan middleware berikut menggunakan parameter konfigurasi "middlewares":
"firewall": Membatasi akses ke alamat IP tertentu
"sslRedirect": Paksa koneksi melalui HTTPS, bukan HTTP
"cors": Dukungan untuk permintaan CORS (diaktifkan secara default)
"xsrf": Blokir serangan XSRF menggunakan metode 'Double Submit Cookie'
"ajaxOnly": Batasi permintaan non-AJAX untuk mencegah serangan XSRF
"apiKeyAuth": Dukungan untuk "Otentikasi Kunci API"
"apiKeyDbAuth": Dukungan untuk "Otentikasi Basis Data Kunci API"
"dbAuth": Dukungan untuk "Otentikasi Basis Data"
"wpAuth": Dukungan untuk "Otentikasi Wordpress"
"jwtAuth": Dukungan untuk "Otentikasi JWT"
"basicAuth": Dukungan untuk "Otentikasi Dasar"
"reconnect": Menyambungkan kembali ke database dengan parameter berbeda
"otorisasi": Membatasi akses ke tabel atau kolom tertentu
"validasi": Mengembalikan kesalahan validasi masukan untuk aturan khusus dan aturan tipe default
"ipAddress": Isi bidang yang dilindungi dengan alamat IP saat dibuat
"sanitasi": Terapkan sanitasi masukan saat membuat dan memperbarui
"multiTenancy": Membatasi akses penyewa dalam skenario multi-penyewa
"pageLimits": Membatasi operasi daftar untuk mencegah pengikisan database
"joinLimits": Membatasi parameter gabungan untuk mencegah pengikisan basis data
"textSearch": Cari di semua bidang teks dengan parameter sederhana
"kustomisasi": Menyediakan penangan untuk kustomisasi permintaan dan respons
"json": Mendukung baca/tulis string JSON sebagai objek/array JSON
"xml": Menerjemahkan semua input dan output dari JSON ke XML
Parameter konfigurasi "middlewares" adalah daftar middleware aktif yang dipisahkan koma. Anda dapat menyesuaikan perilaku middleware menggunakan parameter konfigurasi khusus middleware:
"firewall.reverseProxy": Setel ke "true" ketika proxy terbalik digunakan ("")
"firewall.allowedIpAddresses": Daftar alamat IP yang diperbolehkan untuk terhubung ("")
"cors.allowedOrigins": Asal diperbolehkan di header CORS ("*")
"cors.allowHeaders": Header yang diizinkan dalam permintaan CORS ("Tipe Konten, X-XSRF-TOKEN, X-Otorisasi")
"cors.allowMethods": Metode yang diperbolehkan dalam permintaan CORS ("OPTIONS, GET, PUT, POST, DELETE, PATCH")
"cors.allowCredentials": Untuk mengizinkan kredensial dalam permintaan CORS ("true")
"cors.exposeHeaders": Daftar putih header yang boleh diakses oleh browser ("")
"cors.maxAge": Waktu validitas pemberian CORS dalam hitungan detik ("1728000")
"xsrf.excludeMethods": Metode yang tidak memerlukan perlindungan XSRF ("OPTIONS,GET")
"xsrf.cookieName": Nama cookie perlindungan XSRF ("XSRF-TOKEN")
"xsrf.headerName": Nama header perlindungan XSRF ("X-XSRF-TOKEN")
"ajaxOnly.excludeMethods": Metode yang tidak memerlukan AJAX ("OPTIONS,GET")
"ajaxOnly.headerName": Nama header yang diperlukan ("X-Requested-With")
"ajaxOnly.headerValue": Nilai header yang diperlukan ("XMLHttpRequest")
"apiKeyAuth.mode": Setel ke "opsional" jika Anda ingin mengizinkan akses anonim ("wajib")
"apiKeyAuth.header": Nama header kunci API ("X-API-Key")
"apiKeyAuth.keys": Daftar kunci API yang valid ("")
"apiKeyDbAuth.mode": Setel ke "opsional" jika Anda ingin mengizinkan akses anonim ("wajib")
"apiKeyDbAuth.header": Nama header kunci API ("X-API-Key")
"apiKeyDbAuth.usersTable": Tabel yang digunakan untuk menyimpan pengguna di ("pengguna")
"apiKeyDbAuth.apiKeyColumn": Kolom tabel pengguna yang menyimpan kunci API ("api_key")
"dbAuth.mode": Setel ke "opsional" jika Anda ingin mengizinkan akses anonim ("wajib")
"dbAuth.usersTable": Tabel yang digunakan untuk menyimpan pengguna di ("pengguna")
"dbAuth.loginTable": Tabel atau tampilan yang digunakan untuk mengambil info pengguna untuk login ("pengguna")
"dbAuth.usernameColumn": Kolom tabel pengguna yang menyimpan nama pengguna ("nama pengguna")
"dbAuth.passwordColumn": Kolom tabel pengguna yang menyimpan kata sandi ("kata sandi")
"dbAuth.returnedColumns": Kolom dikembalikan setelah login berhasil, kosong berarti 'semua' ("")
"dbAuth.usernameFormField": Nama bidang formulir yang menyimpan nama pengguna ("nama pengguna")
"dbAuth.passwordFormField": Nama kolom formulir yang menyimpan kata sandi ("kata sandi")
"dbAuth.newPasswordFormField": Nama kolom formulir yang menyimpan kata sandi baru ("newPassword")
"dbAuth.registerUser": Data pengguna JSON (atau "1") jika Anda ingin titik akhir /register diaktifkan ("")
"dbAuth.loginAfterRegistration": 1 atau nol jika pengguna terdaftar harus login setelah registrasi ("")
"dbAuth.passwordLength": Panjang minimum yang harus dimiliki kata sandi ("12")
"dbAuth.sessionName": Nama sesi PHP yang dimulai ("")
"wpAuth.mode": Setel ke "opsional" jika Anda ingin mengizinkan akses anonim ("wajib")
"wpAuth.wpDirectory": Folder/jalur tempat instalasi Wordpress dapat ditemukan (".")
"wpAuth.usernameFormField": Nama bidang formulir yang menyimpan nama pengguna ("nama pengguna")
"wpAuth.passwordFormField": Nama bidang formulir yang menyimpan kata sandi ("kata sandi")
"jwtAuth.mode": Setel ke "opsional" jika Anda ingin mengizinkan akses anonim ("wajib")
"jwtAuth.header": Nama header yang berisi token JWT ("X-Otorisasi")
"jwtAuth.leeway": Jumlah detik jam yang miring ("5") yang dapat diterima
"jwtAuth.ttl": Jumlah detik validitas token ("30")
"jwtAuth.secrets": Rahasia bersama yang digunakan untuk menandatangani token JWT dengan ("")
"jwtAuth.algorithms": Algoritma yang diperbolehkan, kosong berarti 'semua' ("")
"jwtAuth.audiences": Audiens yang diperbolehkan, kosong berarti 'semua' ("")
"jwtAuth.issuers": Penerbit yang diperbolehkan, kosong berarti 'semua' ("")
"jwtAuth.sessionName": Nama sesi PHP yang dimulai ("")
"basicAuth.mode": Setel ke "opsional" jika Anda ingin mengizinkan akses anonim ("wajib")
"basicAuth.realm": Teks yang diminta saat menampilkan login ("Nama pengguna dan kata sandi diperlukan")
"basicAuth.passwordFile": File yang akan dibaca untuk kombinasi nama pengguna/kata sandi (".htpasswd")
"basicAuth.sessionName": Nama sesi PHP yang dimulai ("")
"reconnect.driverHandler": Handler untuk mengimplementasikan pengambilan driver database ("")
"reconnect.addressHandler": Handler untuk mengimplementasikan pengambilan alamat database ("")
"reconnect.portHandler": Handler untuk mengimplementasikan pengambilan port database ("")
"reconnect.databaseHandler": Handler untuk mengimplementasikan pengambilan nama database ("")
"reconnect.tablesHandler": Handler untuk mengimplementasikan pengambilan nama tabel ("")
"reconnect.mappingHandler": Handler untuk mengimplementasikan pengambilan pemetaan nama ("")
"reconnect.usernameHandler": Handler untuk mengimplementasikan pengambilan nama pengguna database ("")
"reconnect.passwordHandler": Handler untuk mengimplementasikan pengambilan kata sandi database ("")
"authorization.tableHandler": Penangan untuk mengimplementasikan aturan otorisasi tabel ("")
"authorization.columnHandler": Penangan untuk menerapkan aturan otorisasi kolom ("")
"authorization.pathHandler": Penangan untuk mengimplementasikan aturan otorisasi jalur ("")
"authorization.recordHandler": Penangan untuk menerapkan aturan filter otorisasi rekaman ("")
"validation.handler": Penangan untuk menerapkan aturan validasi untuk nilai input ("")
"validation.types": Tipe untuk mengaktifkan validasi tipe, kosong berarti 'tidak ada' ("semua")
"validation.tables": Tabel untuk mengaktifkan validasi tipe, kosong berarti 'tidak ada' ("semua")
"ipAddress.tables": Tabel untuk mencari kolom yang akan diganti dengan alamat IP ("")
"ipAddress.columns": Kolom untuk dilindungi dan diganti dengan alamat IP saat dibuat ("")
"sanitation.handler": Pengendali yang menerapkan aturan sanitasi untuk nilai masukan ("")
"sanitation.types": Tipe yang mengaktifkan tipe sanitasi, kosong berarti 'tidak ada' ("semua")
"sanitation.tables": Tabel yang mengaktifkan jenis sanitasi, kosong berarti 'tidak ada' ("semua")
"multiTenancy.handler": Penangan untuk menerapkan aturan multi-tenancy sederhana ("")
"pageLimits.pages": Nomor halaman maksimum yang diperbolehkan oleh operasi daftar ("100")
"pageLimits.records": Jumlah maksimum rekaman yang dikembalikan oleh operasi daftar ("1000")
"joinLimits. depth": Kedalaman (panjang) maksimum yang diperbolehkan dalam jalur gabungan ("3")
"joinLimits.tables": Jumlah maksimum tabel yang boleh Anda gabung ("10")
"joinLimits.records": Jumlah maksimum rekaman yang dikembalikan untuk entitas yang bergabung ("1000")
"textSearch.parameter": Nama parameter yang digunakan untuk istilah pencarian ("pencarian")
"customization.beforeHandler": Penangan untuk mengimplementasikan penyesuaian permintaan ("")
"customization.afterHandler": Penangan untuk mengimplementasikan penyesuaian respons ("")
"json.controllers": Pengontrol untuk memproses string JSON untuk ("records,geojson")
"json.tables": Tabel untuk memproses string JSON untuk ("semua")
"json.columns": Kolom untuk memproses string JSON untuk ("semua")
"xml.types": Tipe JSON yang harus ditambahkan ke atribut tipe XML ("null,array")
Jika Anda tidak menentukan parameter ini dalam konfigurasi, maka nilai default (di antara tanda kurung) akan digunakan.
Pada bagian di bawah ini Anda akan menemukan informasi lebih lanjut tentang middleware bawaan.
Saat ini ada lima jenis otentikasi yang didukung. Mereka semua menyimpan pengguna yang diautentikasi di $_SESSION
super global. Variabel ini dapat digunakan dalam penangan otorisasi untuk memutuskan apakah seseorang harus memiliki akses baca atau tulis ke tabel, kolom, atau catatan tertentu atau tidak. Ikhtisar berikut menunjukkan jenis middleware autentikasi yang dapat Anda aktifkan.
Nama | Perangkat Tengah | Diautentikasi melalui | Pengguna disimpan di | Variabel sesi |
---|---|---|---|---|
Kunci API | apiKeyAuth | Tajuk 'Kunci-X-API' | konfigurasi | $_SESSION['apiKey'] |
DB kunci API | apiKeyDbAuth | Tajuk 'Kunci-X-API' | tabel basis data | $_SESSION['apiUser'] |
Basis data | dbAuth | titik akhir '/ masuk' | tabel basis data | $_SESSION['user'] |
Dasar | basicAuth | Tajuk 'Otorisasi' | berkas '.htpasswd' | $_SESSION['username'] |
JWT | jwtAuth | Tajuk 'Otorisasi' | penyedia identitas | $_SESSION['claims'] |
Di bawah ini Anda menemukan informasi selengkapnya tentang masing-masing jenis autentikasi.
Otentikasi kunci API bekerja dengan mengirimkan kunci API di header permintaan. Nama header defaultnya adalah "X-API-Key" dan dapat dikonfigurasi menggunakan parameter konfigurasi 'apiKeyAuth.header'. Kunci API yang valid harus dikonfigurasi menggunakan parameter konfigurasi 'apiKeyAuth.keys' (daftar yang dipisahkan koma).
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
Kunci API yang diautentikasi akan disimpan dalam variabel $_SESSION['apiKey']
.
Perhatikan bahwa autentikasi kunci API tidak memerlukan atau menggunakan cookie sesi.
Otentikasi basis data kunci API bekerja dengan mengirimkan kunci API di header permintaan "X-API-Key" (namanya dapat dikonfigurasi). Kunci API yang valid dibaca dari database dari kolom "api_key" pada tabel "pengguna" (kedua nama dapat dikonfigurasi).
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
Pengguna yang diautentikasi (dengan semua propertinya) akan disimpan dalam variabel $_SESSION['apiUser']
.
Perhatikan bahwa otentikasi basis data kunci API tidak memerlukan atau menggunakan cookie sesi.
Middleware otentikasi database mendefinisikan lima rute baru:
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
Seorang pengguna dapat masuk dengan mengirimkan nama pengguna dan kata sandinya ke titik akhir masuk (dalam format JSON). Pengguna yang diautentikasi (dengan semua propertinya) akan disimpan dalam variabel $_SESSION['user']
. Pengguna dapat keluar dengan mengirimkan permintaan POST dengan isi kosong ke titik akhir logout. Kata sandi disimpan sebagai hash di kolom kata sandi di tabel pengguna. Anda dapat mendaftarkan pengguna baru menggunakan titik akhir register, namun fungsi ini harus diaktifkan menggunakan parameter konfigurasi "dbAuth.registerUser".
PENTING untuk membatasi akses ke tabel pengguna menggunakan middleware 'otorisasi', jika tidak, semua pengguna dapat dengan bebas menambah, mengubah, atau menghapus akun apa pun! Konfigurasi minimal ditunjukkan di bawah ini:
'middlewares' => 'dbAuth,authorization', 'authorization.tableHandler' => function ($operation, $tableName) { return $tableName != 'users'; },
Perhatikan bahwa middleware ini menggunakan cookie sesi dan menyimpan status login di server.
Masuk menggunakan tampilan dengan tabel bergabung
Untuk operasi login, dimungkinkan untuk menggunakan tampilan sebagai tabel pengguna. Tampilan tersebut dapat mengembalikan hasil yang difilter dari tabel pengguna, misalnya, di mana aktif = true atau dapat juga mengembalikan hasil beberapa tabel melalui gabungan tabel. Minimal, tampilan harus menyertakan nama pengguna dan kata sandi serta bidang bernama id .
Namun, tampilan dengan tabel yang digabungkan tidak dapat disisipkan (lihat edisi 907). Sebagai solusinya, gunakan properti loginTable untuk menyetel tabel referensi berbeda untuk login. UsersTable akan tetap disetel ke tabel pengguna normal yang dapat disisipkan.
Middleware otentikasi Wordpress mendefinisikan tiga rute:
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
Seorang pengguna dapat masuk dengan mengirimkan nama pengguna dan kata sandinya ke titik akhir masuk (dalam format JSON). Pengguna dapat keluar dengan mengirimkan permintaan POST dengan isi kosong ke titik akhir logout. Anda perlu menentukan direktori instalasi Wordpress menggunakan parameter konfigurasi "wpAuth.wpDirectory". Middleware memanggil "wp-load.php" ini memungkinkan Anda untuk menggunakan fungsi Wordpress di middleware otorisasi, seperti:
wp_get_current_user()
is_user_logged_in()
is_super_admin()
user_can(wp_get_current_user(),'edit_posts');
Perhatikan bahwa variabel $_SESSION
tidak digunakan oleh middleware ini.
Tipe Dasar mendukung file (secara default '.htpasswd') yang menyimpan pengguna dan kata sandi (hash) mereka yang dipisahkan oleh titik dua (':'). Ketika kata sandi dimasukkan dalam teks biasa, kata sandi tersebut akan di-hash secara otomatis. Nama pengguna yang diautentikasi akan disimpan dalam variabel $_SESSION['username']
. Anda perlu mengirim tajuk "Otorisasi" yang berisi versi kode nama dan kata sandi Anda yang dipisahkan titik dua, setelah kata "Dasar" yang disandikan url base64.
Authorization: Basic dXNlcm5hbWUxOnBhc3N3b3JkMQ
Contoh ini mengirimkan string "nama pengguna1:kata sandi1".
Jenis JWT memerlukan server lain (SSO/Identitas) untuk menandatangani token yang berisi klaim. Kedua server berbagi rahasia sehingga mereka dapat menandatangani atau memverifikasi bahwa tanda tangan tersebut valid. Klaim disimpan dalam variabel $_SESSION['claims']
. Anda perlu mengirim header "X-Otorisasi" yang berisi url base64 yang dikodekan dan header token, badan, dan tanda tangan yang dipisahkan titik setelah kata "Pembawa" (baca lebih lanjut tentang JWT di sini). Standarnya mengatakan Anda perlu menggunakan header "Otorisasi", tetapi ini bermasalah di Apache dan PHP.
X-Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6IjE1MzgyMDc2MDUiLCJleHAiOjE1MzgyMDc2MzV9.Z5px_GT15TRKhJCTHhDt5Z6K6LRDSFnLj8U5ok9l7gw
Contoh ini mengirimkan klaim yang ditandatangani:
{ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": "1538207605", "exp": 1538207635 }
NB: Implementasi JWT hanya mendukung algoritma berbasis RSA dan HMAC.