MySQL/MariaDB, PostgreSQL, SQL Server 또는 SQLite 데이터베이스에 REST API를 추가하는 단일 파일 PHP 스크립트입니다.
Howto: " api.php
"를 웹 서버에 업로드하고, 데이터베이스에 연결하도록 구성하고, 즉시 모든 기능을 갖춘 REST API를 갖습니다.
주의: 이것은 PHP의 TreeQL 참조 구현입니다.
다음 데이터베이스 시스템 중 하나에 대해 PDO 드라이버가 활성화된 PHP 7.2 이상:
MySQL의 공간 기능을 위한 MySQL 5.7 / MariaDB 10.0 이상
공간 기능을 위한 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
파일 하단의 구성을 수정하는 것을 잊지 마세요.
또는 이 프로젝트를 원하는 웹 프레임워크에 통합할 수 있습니다. 다음을 참조하세요.
Laravel용 자동 REST API
Symfony 4용 자동 REST API
SlimPHP 4용 자동 REST API
이러한 통합에서는 Composer를 사용하여 이 프로젝트를 종속성으로 로드합니다.
Composer를 사용하지 않는 분들을 위해 " api.include.php
" 파일이 제공됩니다. 이 파일에는 " src/index.php
"의 구성을 제외한 " api.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=localhost
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 빠른 시작: PHP-CRUD-API를 갖춘 사용자 정의 가능하고 바로 사용할 수 있는 Docker Compose 파일입니다.
PHP-CRUD-API 필터 생성기: 표현식에서 PHP-CRUD-API 필터를 생성하는 JavaScript 라이브러리입니다.
JS-CRUD-API: PHP-CRUD-API API용 JavaScript 클라이언트 라이브러리
PHP-API-AUTH: PHP-CRUD-API용 인증 공급자인 단일 파일 PHP 스크립트
PHP-CRUD-UI: PHP-CRUD-API 프로젝트에 UI를 추가하는 단일 파일 PHP 스크립트입니다.
PHP-CRUD-ADMIN: PHP-CRUD-API 프로젝트에 데이터베이스 관리 인터페이스를 추가하는 단일 파일 PHP 스크립트입니다.
PHP-SP-API: SQL 데이터베이스에 REST API를 추가하는 단일 파일 PHP 스크립트입니다.
dexie-mysql-sync: 로컬 IndexedDB와 MySQL 데이터베이스 간의 동기화.
ra-data-treeql: React Admin을 위한 데이터 공급자를 제공하는 NPM 패키지입니다.
scriptPilot/vueuse: VueUse.org 외에 Vue 컴포저블(PHP-CRUD-API 지원)
scriptPilot/add-php-backend: 개발 환경에 MySQL, phpMyAdmin 및 PHP-CRUD-API를 추가합니다.
VUE-CRUD-UI: PHP-CRUD-API 프로젝트에 UI를 추가하는 단일 파일 Vue.js 스크립트입니다.
다음 위치에도 이 스크립트의 포트가 있습니다.
Go-CRUD-API(작업 진행 중)
Ivan Kolchagov의 Java JDBC(v1)
Java Spring Boot + jOOQ(v2: 작업 진행 중)
PHP, Java, Go, C# .net 코어, Node.js 및 Python에서 기본 REST CRUD 기능만 지원하는 이 스크립트의 개념 증명 포트도 있습니다.
다음 명령을 사용하여 이 프로젝트의 모든 종속성을 설치할 수 있습니다.
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 ======= id title content created
아래 CRUD + 목록 작업은 이 테이블에서 수행됩니다.
레코드를 생성하려면 다음과 같이 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" 값이 포함되어 있음).
"eq"가 "neq"가 되도록 "n" 문자를 앞에 추가하여 모든 필터를 무효화할 수 있습니다. 필터 사용의 예는 다음과 같습니다.
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" 매개변수를 반복하여 적용할 수 있습니다. 예를 들어 다음 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
보시다시피 "AND" 대신 "OR"이 적용되어야 함을 나타내기 위해 "filter" 매개변수에 숫자를 추가했습니다. "filter1"을 반복하고 "OR" 내에 "AND"를 만들 수도 있습니다. 문자(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" }
주의: 관련 엔터티를 포함하는 데 사용되는 열은 자동으로 추가되며 출력에서 제외할 수 없습니다.
"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" } ] }
주의: 여러 "순서" 매개변수를 사용하여 여러 필드를 정렬할 수 있습니다. "결합된" 열에서는 주문할 수 없습니다.
"size" 매개변수는 반환되는 레코드 수를 제한합니다. 이는 "order" 매개변수(내림차순 사용)와 함께 상위 N 목록에 사용될 수 있습니다.
GET /records/categories?order=id,desc&size=1
산출:
{ "records":[ { "id": 3 "name": "Web development" } ] }
주의: 총 레코드 수도 알고 싶다면 "페이지" 매개변수를 사용할 수 있습니다.
"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, presentsTo 및 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
" 엔드포인트를 내부적으로 사용하고 조인 및 필터와 같은 모든 기능을 상속합니다. 또한 테이블에 둘 이상이 있는 경우 기하학 열의 이름을 나타내는 "geometry" 매개변수를 지원합니다. 지도 보기의 경우 왼쪽 위 및 오른쪽 아래 좌표(쉼표로 구분)를 지정할 수 있는 "bbox" 매개변수를 지원합니다. GeoJSON 구현에서는 다음 Geometry 유형을 지원합니다.
가리키다
멀티포인트
유도선
다중선문자열
다각형
다중 다각형
GeoJSON 기능은 기본적으로 활성화되어 있지만 "컨트롤러" 구성을 사용하여 비활성화할 수 있습니다.
레거시 시스템(예: Wordpress)에 대한 API 생성을 지원하려면 소프트웨어를 변경하지 않고는 개선할 수 없으므로 테이블과 열 이름을 매핑해야 할 수 있지만 이름은 일관성을 위해 약간의 개선이 필요할 수 있습니다. 구성을 사용하면 다음과 같이 등호로 분할된 쉼표로 구분된 매핑 목록을 사용하여 테이블과 열의 이름을 바꿀 수 있습니다.
'mapping' => 'wp_posts=posts,wp_posts.ID=posts.id',
이 특정 예는 " posts
" 끝점(" wp_posts
" 대신)에서 " wp_posts
" 테이블을 노출하고 해당 테이블 내의 " ID
" 열을 " id
" 속성(대문자 대신 소문자)으로 노출합니다.
주의: 이 두 매핑은 겹치기 때문에 첫 번째(덜 구체적인) 매핑은 생략될 수 있습니다.
"middlewares" 구성 매개변수를 사용하여 다음 미들웨어를 활성화할 수 있습니다.
"방화벽": 특정 IP 주소에 대한 액세스를 제한합니다.
"sslRedirect": HTTP 대신 HTTPS를 통해 강제 연결
"cors": CORS 요청 지원(기본적으로 활성화됨)
"xsrf": 'Double Submit Cookie' 방법을 사용하여 XSRF 공격을 차단합니다.
"ajaxOnly": XSRF 공격을 방지하기 위해 AJAX가 아닌 요청을 제한합니다.
"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 보호 쿠키의 이름("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": /register 엔드포인트를 활성화하려는 경우("") JSON 사용자 데이터(또는 "1")
"dbAuth.loginAfterRegistration": 등록된 사용자가 등록 후 로그인되어야 하는 경우 1 또는 0("")
"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.length": 조인 경로에 허용되는 최대 깊이(길이)("3")
"joinLimits.tables": 조인이 허용된 최대 테이블 수("10")
"joinLimits.records": 조인된 엔터티에 대해 반환된 최대 레코드 수("1000")
"textSearch.parameter": 검색어("search")에 사용되는 매개변수의 이름
"customization.beforeHandler": 요청 사용자 정의를 구현하기 위한 핸들러("")
"customization.afterHandler": 응답 사용자 정의를 구현하는 핸들러("")
"json.controllers": ("records,geojson")에 대한 JSON 문자열을 처리하는 컨트롤러
"json.tables": ("all")에 대한 JSON 문자열을 처리할 테이블
"json.columns": ("all")에 대해 JSON 문자열을 처리할 열
"xml.types": XML 유형 속성("null,array")에 추가되어야 하는 JSON 유형
구성에서 이러한 매개변수를 지정하지 않으면 기본값(대괄호 사이)이 사용됩니다.
아래 섹션에서는 내장 미들웨어에 대한 자세한 정보를 찾을 수 있습니다.
현재 5가지 유형의 인증이 지원됩니다. 그들은 모두 인증된 사용자를 $_SESSION
슈퍼 전역에 저장합니다. 이 변수는 권한 부여 처리기에서 누군가가 특정 테이블, 열 또는 레코드에 대한 읽기 또는 쓰기 액세스 권한을 가져야 하는지 여부를 결정하는 데 사용될 수 있습니다. 다음 개요에서는 활성화할 수 있는 인증 미들웨어의 종류를 보여줍니다.
이름 | 미들웨어 | 다음을 통해 인증됨 | 사용자는 다음 위치에 저장됩니다. | 세션 변수 |
---|---|---|---|---|
API 키 | API키 인증 | 'X-API-키' 헤더 | 구성 | $_SESSION['apiKey'] |
API 키 DB | apiKeyDbAuth | 'X-API-키' 헤더 | 데이터베이스 테이블 | $_SESSION['apiUser'] |
데이터 베이스 | DB인증 | '/login' 끝점 | 데이터베이스 테이블 | $_SESSION['user'] |
기초적인 | 기본 인증 | '승인' 헤더 | '.htpasswd' 파일 | $_SESSION['username'] |
JWT | jwt인증 | '승인' 헤더 | 신원 공급자 | $_SESSION['claims'] |
아래에서 각 인증 유형에 대한 자세한 정보를 확인할 수 있습니다.
API 키 인증은 요청 헤더에 API 키를 보내는 방식으로 작동합니다. 헤더 이름의 기본값은 "X-API-Key"이며 'apiKeyAuth.header' 구성 매개변수를 사용하여 구성할 수 있습니다. 유효한 API 키는 'apiKeyAuth.keys' 구성 매개변수(쉼표로 구분된 목록)를 사용하여 구성해야 합니다.
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
인증된 API 키는 $_SESSION['apiKey']
변수에 저장됩니다.
API 키 인증에는 세션 쿠키가 필요하지 않거나 사용되지 않습니다.
API 키 데이터베이스 인증은 요청 헤더 "X-API-Key"(이름은 구성 가능)에 API 키를 전송하여 작동합니다. 데이터베이스에서 "users" 테이블의 "api_key" 열에 있는 유효한 API 키를 읽습니다(두 이름 모두 구성 가능).
X-API-Key: 02c042aa-c3c2-4d11-9dae-1a6e230ea95e
인증된 사용자(모든 속성 포함)는 $_SESSION['apiUser']
변수에 저장됩니다.
API 키 데이터베이스 인증에는 세션 쿠키가 필요하지 않거나 사용되지 않습니다.
데이터베이스 인증 미들웨어는 5개의 새로운 경로를 정의합니다.
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'; },
이 미들웨어는 세션 쿠키를 사용하고 로그인 상태를 서버에 저장합니다.
조인된 테이블이 있는 뷰를 사용하여 로그인
로그인 작업의 경우 뷰를 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"이라는 단어 뒤에 콜론으로 구분된 사용자 이름과 비밀번호의 base64 URL 인코딩 버전이 포함된 "Authorization" 헤더를 보내야 합니다.
Authorization: Basic dXNlcm5hbWUxOnBhc3N3b3JkMQ
이 예에서는 "username1:password1" 문자열을 보냅니다.
JWT 유형의 경우 클레임이 포함된 토큰에 서명하려면 다른(SSO/ID) 서버가 필요합니다. 두 서버 모두 서명이 유효한지 서명하거나 확인할 수 있도록 비밀을 공유합니다. 클레임은 $_SESSION['claims']
변수에 저장됩니다. "Bearer"라는 단어 뒤에 base64 URL로 인코딩되고 점으로 구분된 토큰 헤더, 본문 및 서명이 포함된 "X-Authorization" 헤더를 보내야 합니다(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 기반 알고리즘만 지원합니다.