|
@@ -99,7 +99,7 @@ The following features are supported:
|
99
|
99
|
- Supports a JSON array as input (batch insert)
|
100
|
100
|
- Sanitize and validate input using callbacks
|
101
|
101
|
- Permission system for databases, tables, columns and records
|
102
|
|
- - Multi-tenant database layouts are supported
|
|
102
|
+ - Multi-tenant single and multi database layouts are supported
|
103
|
103
|
- Multi-domain CORS support for cross-domain requests
|
104
|
104
|
- Support for reading joined results from multiple tables
|
105
|
105
|
- Search support on multiple criteria
|
|
@@ -110,6 +110,7 @@ The following features are supported:
|
110
|
110
|
- Spatial/GIS fields and filters supported with WKT and GeoJSON
|
111
|
111
|
- Generate API documentation using OpenAPI tools
|
112
|
112
|
- Authentication via JWT token or username/password
|
|
113
|
+ - Database connection parameters may depend on authentication
|
113
|
114
|
- Support for reading database structure in JSON
|
114
|
115
|
- Support for modifying database structure using REST endpoint
|
115
|
116
|
- Security enhancing middleware is included
|
|
@@ -137,84 +138,6 @@ This script will install and run [Composer](https://getcomposer.org/) to update
|
137
|
138
|
|
138
|
139
|
NB: The update script will also patch the dependencies in the vendor directory for PHP 7.0 compatibility.
|
139
|
140
|
|
140
|
|
-## Middleware
|
141
|
|
-
|
142
|
|
-You can enable the following middleware using the "middlewares" config parameter:
|
143
|
|
-
|
144
|
|
-- "firewall": Limit access to specific IP addresses
|
145
|
|
-- "cors": Support for CORS requests (enabled by default)
|
146
|
|
-- "xsrf": Block XSRF attacks using the 'Double Submit Cookie' method
|
147
|
|
-- "ajaxOnly": Restrict non-AJAX requests to prevent XSRF attacks
|
148
|
|
-- "dbAuth": Support for "Database Authentication"
|
149
|
|
-- "jwtAuth": Support for "JWT Authentication"
|
150
|
|
-- "basicAuth": Support for "Basic Authentication"
|
151
|
|
-- "reconnect": Reconnect to the database with different parameters
|
152
|
|
-- "authorization": Restrict access to certain tables or columns
|
153
|
|
-- "validation": Return input validation errors for custom rules
|
154
|
|
-- "ipAddress": Fill a protected field with the IP address on create
|
155
|
|
-- "sanitation": Apply input sanitation on create and update
|
156
|
|
-- "multiTenancy": Restricts tenants access in a multi-tenant scenario
|
157
|
|
-- "pageLimits": Restricts list operations to prevent database scraping
|
158
|
|
-- "joinLimits": Restricts join parameters to prevent database scraping
|
159
|
|
-- "customization": Provides handlers for request and response customization
|
160
|
|
-
|
161
|
|
-The "middlewares" config parameter is a comma separated list of enabled middlewares.
|
162
|
|
-You can tune the middleware behavior using middleware specific configuration parameters:
|
163
|
|
-
|
164
|
|
-- "firewall.reverseProxy": Set to "true" when a reverse proxy is used ("")
|
165
|
|
-- "firewall.allowedIpAddresses": List of IP addresses that are allowed to connect ("")
|
166
|
|
-- "cors.allowedOrigins": The origins allowed in the CORS headers ("*")
|
167
|
|
-- "cors.allowHeaders": The headers allowed in the CORS request ("Content-Type, X-XSRF-TOKEN")
|
168
|
|
-- "cors.allowMethods": The methods allowed in the CORS request ("OPTIONS, GET, PUT, POST, DELETE, PATCH")
|
169
|
|
-- "cors.allowCredentials": To allow credentials in the CORS request ("true")
|
170
|
|
-- "cors.exposeHeaders": Whitelist headers that browsers are allowed to access ("")
|
171
|
|
-- "cors.maxAge": The time that the CORS grant is valid in seconds ("1728000")
|
172
|
|
-- "xsrf.excludeMethods": The methods that do not require XSRF protection ("OPTIONS,GET")
|
173
|
|
-- "xsrf.cookieName": The name of the XSRF protection cookie ("XSRF-TOKEN")
|
174
|
|
-- "xsrf.headerName": The name of the XSRF protection header ("X-XSRF-TOKEN")
|
175
|
|
-- "ajaxOnly.excludeMethods": The methods that do not require AJAX ("OPTIONS,GET")
|
176
|
|
-- "ajaxOnly.headerName": The name of the required header ("X-Requested-With")
|
177
|
|
-- "ajaxOnly.headerValue": The value of the required header ("XMLHttpRequest")
|
178
|
|
-- "dbAuth.mode": Set to "optional" if you want to allow anonymous access ("required")
|
179
|
|
-- "dbAuth.usersTable": The table that is used to store the users in ("users")
|
180
|
|
-- "dbAuth.usernameColumn": The users table column that holds usernames ("username")
|
181
|
|
-- "dbAuth.passwordColumn": The users table column that holds passwords ("password")
|
182
|
|
-- "dbAuth.returnedColumns": The columns returned on successful login, empty means 'all' ("")
|
183
|
|
-- "jwtAuth.mode": Set to "optional" if you want to allow anonymous access ("required")
|
184
|
|
-- "jwtAuth.header": Name of the header containing the JWT token ("X-Authorization")
|
185
|
|
-- "jwtAuth.leeway": The acceptable number of seconds of clock skew ("5")
|
186
|
|
-- "jwtAuth.ttl": The number of seconds the token is valid ("30")
|
187
|
|
-- "jwtAuth.secret": The shared secret used to sign the JWT token with ("")
|
188
|
|
-- "jwtAuth.algorithms": The algorithms that are allowed, empty means 'all' ("")
|
189
|
|
-- "jwtAuth.audiences": The audiences that are allowed, empty means 'all' ("")
|
190
|
|
-- "jwtAuth.issuers": The issuers that are allowed, empty means 'all' ("")
|
191
|
|
-- "basicAuth.mode": Set to "optional" if you want to allow anonymous access ("required")
|
192
|
|
-- "basicAuth.realm": Text to prompt when showing login ("Username and password required")
|
193
|
|
-- "basicAuth.passwordFile": The file to read for username/password combinations (".htpasswd")
|
194
|
|
-- "reconnect.driverHandler": Handler to implement retrieval of the database driver ("")
|
195
|
|
-- "reconnect.addressHandler": Handler to implement retrieval of the database address ("")
|
196
|
|
-- "reconnect.portHandler": Handler to implement retrieval of the database port ("")
|
197
|
|
-- "reconnect.databaseHandler": Handler to implement retrieval of the database name ("")
|
198
|
|
-- "reconnect.usernameHandler": Handler to implement retrieval of the database username ("")
|
199
|
|
-- "reconnect.passwordHandler": Handler to implement retrieval of the database password ("")
|
200
|
|
-- "authorization.tableHandler": Handler to implement table authorization rules ("")
|
201
|
|
-- "authorization.columnHandler": Handler to implement column authorization rules ("")
|
202
|
|
-- "authorization.recordHandler": Handler to implement record authorization filter rules ("")
|
203
|
|
-- "validation.handler": Handler to implement validation rules for input values ("")
|
204
|
|
-- "ipAddress.tables": Tables to search for columns to override with IP address ("")
|
205
|
|
-- "ipAddress.columns": Columns to protect and override with the IP address on create ("")
|
206
|
|
-- "sanitation.handler": Handler to implement sanitation rules for input values ("")
|
207
|
|
-- "multiTenancy.handler": Handler to implement simple multi-tenancy rules ("")
|
208
|
|
-- "pageLimits.pages": The maximum page number that a list operation allows ("100")
|
209
|
|
-- "pageLimits.records": The maximum number of records returned by a list operation ("1000")
|
210
|
|
-- "joinLimits.depth": The maximum depth (length) that is allowed in a join path ("3")
|
211
|
|
-- "joinLimits.tables": The maximum number of tables that you are allowed to join ("10")
|
212
|
|
-- "joinLimits.records": The maximum number of records returned for a joined entity ("1000")
|
213
|
|
-- "customization.beforeHandler": Handler to implement request customization ("")
|
214
|
|
-- "customization.afterHandler": Handler to implement response customization ("")
|
215
|
|
-
|
216
|
|
-If you don't specify these parameters in the configuration, then the default values (between brackets) are used.
|
217
|
|
-
|
218
|
141
|
## TreeQL, a pragmatic GraphQL
|
219
|
142
|
|
220
|
143
|
[TreeQL](https://treeql.org) allows you to create a "tree" of JSON objects based on your SQL database structure (relations) and your query.
|
|
@@ -646,6 +569,86 @@ The following Geometry types are supported by the GeoJSON implementation:
|
646
|
569
|
|
647
|
570
|
The GeoJSON functionality is enabled by default, but can be disabled using the "controllers" configuration.
|
648
|
571
|
|
|
572
|
+## Middleware
|
|
573
|
+
|
|
574
|
+You can enable the following middleware using the "middlewares" config parameter:
|
|
575
|
+
|
|
576
|
+- "firewall": Limit access to specific IP addresses
|
|
577
|
+- "cors": Support for CORS requests (enabled by default)
|
|
578
|
+- "xsrf": Block XSRF attacks using the 'Double Submit Cookie' method
|
|
579
|
+- "ajaxOnly": Restrict non-AJAX requests to prevent XSRF attacks
|
|
580
|
+- "dbAuth": Support for "Database Authentication"
|
|
581
|
+- "jwtAuth": Support for "JWT Authentication"
|
|
582
|
+- "basicAuth": Support for "Basic Authentication"
|
|
583
|
+- "reconnect": Reconnect to the database with different parameters
|
|
584
|
+- "authorization": Restrict access to certain tables or columns
|
|
585
|
+- "validation": Return input validation errors for custom rules
|
|
586
|
+- "ipAddress": Fill a protected field with the IP address on create
|
|
587
|
+- "sanitation": Apply input sanitation on create and update
|
|
588
|
+- "multiTenancy": Restricts tenants access in a multi-tenant scenario
|
|
589
|
+- "pageLimits": Restricts list operations to prevent database scraping
|
|
590
|
+- "joinLimits": Restricts join parameters to prevent database scraping
|
|
591
|
+- "customization": Provides handlers for request and response customization
|
|
592
|
+
|
|
593
|
+The "middlewares" config parameter is a comma separated list of enabled middlewares.
|
|
594
|
+You can tune the middleware behavior using middleware specific configuration parameters:
|
|
595
|
+
|
|
596
|
+- "firewall.reverseProxy": Set to "true" when a reverse proxy is used ("")
|
|
597
|
+- "firewall.allowedIpAddresses": List of IP addresses that are allowed to connect ("")
|
|
598
|
+- "cors.allowedOrigins": The origins allowed in the CORS headers ("*")
|
|
599
|
+- "cors.allowHeaders": The headers allowed in the CORS request ("Content-Type, X-XSRF-TOKEN")
|
|
600
|
+- "cors.allowMethods": The methods allowed in the CORS request ("OPTIONS, GET, PUT, POST, DELETE, PATCH")
|
|
601
|
+- "cors.allowCredentials": To allow credentials in the CORS request ("true")
|
|
602
|
+- "cors.exposeHeaders": Whitelist headers that browsers are allowed to access ("")
|
|
603
|
+- "cors.maxAge": The time that the CORS grant is valid in seconds ("1728000")
|
|
604
|
+- "xsrf.excludeMethods": The methods that do not require XSRF protection ("OPTIONS,GET")
|
|
605
|
+- "xsrf.cookieName": The name of the XSRF protection cookie ("XSRF-TOKEN")
|
|
606
|
+- "xsrf.headerName": The name of the XSRF protection header ("X-XSRF-TOKEN")
|
|
607
|
+- "ajaxOnly.excludeMethods": The methods that do not require AJAX ("OPTIONS,GET")
|
|
608
|
+- "ajaxOnly.headerName": The name of the required header ("X-Requested-With")
|
|
609
|
+- "ajaxOnly.headerValue": The value of the required header ("XMLHttpRequest")
|
|
610
|
+- "dbAuth.mode": Set to "optional" if you want to allow anonymous access ("required")
|
|
611
|
+- "dbAuth.usersTable": The table that is used to store the users in ("users")
|
|
612
|
+- "dbAuth.usernameColumn": The users table column that holds usernames ("username")
|
|
613
|
+- "dbAuth.passwordColumn": The users table column that holds passwords ("password")
|
|
614
|
+- "dbAuth.returnedColumns": The columns returned on successful login, empty means 'all' ("")
|
|
615
|
+- "jwtAuth.mode": Set to "optional" if you want to allow anonymous access ("required")
|
|
616
|
+- "jwtAuth.header": Name of the header containing the JWT token ("X-Authorization")
|
|
617
|
+- "jwtAuth.leeway": The acceptable number of seconds of clock skew ("5")
|
|
618
|
+- "jwtAuth.ttl": The number of seconds the token is valid ("30")
|
|
619
|
+- "jwtAuth.secret": The shared secret used to sign the JWT token with ("")
|
|
620
|
+- "jwtAuth.algorithms": The algorithms that are allowed, empty means 'all' ("")
|
|
621
|
+- "jwtAuth.audiences": The audiences that are allowed, empty means 'all' ("")
|
|
622
|
+- "jwtAuth.issuers": The issuers that are allowed, empty means 'all' ("")
|
|
623
|
+- "basicAuth.mode": Set to "optional" if you want to allow anonymous access ("required")
|
|
624
|
+- "basicAuth.realm": Text to prompt when showing login ("Username and password required")
|
|
625
|
+- "basicAuth.passwordFile": The file to read for username/password combinations (".htpasswd")
|
|
626
|
+- "reconnect.driverHandler": Handler to implement retrieval of the database driver ("")
|
|
627
|
+- "reconnect.addressHandler": Handler to implement retrieval of the database address ("")
|
|
628
|
+- "reconnect.portHandler": Handler to implement retrieval of the database port ("")
|
|
629
|
+- "reconnect.databaseHandler": Handler to implement retrieval of the database name ("")
|
|
630
|
+- "reconnect.usernameHandler": Handler to implement retrieval of the database username ("")
|
|
631
|
+- "reconnect.passwordHandler": Handler to implement retrieval of the database password ("")
|
|
632
|
+- "authorization.tableHandler": Handler to implement table authorization rules ("")
|
|
633
|
+- "authorization.columnHandler": Handler to implement column authorization rules ("")
|
|
634
|
+- "authorization.recordHandler": Handler to implement record authorization filter rules ("")
|
|
635
|
+- "validation.handler": Handler to implement validation rules for input values ("")
|
|
636
|
+- "ipAddress.tables": Tables to search for columns to override with IP address ("")
|
|
637
|
+- "ipAddress.columns": Columns to protect and override with the IP address on create ("")
|
|
638
|
+- "sanitation.handler": Handler to implement sanitation rules for input values ("")
|
|
639
|
+- "multiTenancy.handler": Handler to implement simple multi-tenancy rules ("")
|
|
640
|
+- "pageLimits.pages": The maximum page number that a list operation allows ("100")
|
|
641
|
+- "pageLimits.records": The maximum number of records returned by a list operation ("1000")
|
|
642
|
+- "joinLimits.depth": The maximum depth (length) that is allowed in a join path ("3")
|
|
643
|
+- "joinLimits.tables": The maximum number of tables that you are allowed to join ("10")
|
|
644
|
+- "joinLimits.records": The maximum number of records returned for a joined entity ("1000")
|
|
645
|
+- "customization.beforeHandler": Handler to implement request customization ("")
|
|
646
|
+- "customization.afterHandler": Handler to implement response customization ("")
|
|
647
|
+
|
|
648
|
+If you don't specify these parameters in the configuration, then the default values (between brackets) are used.
|
|
649
|
+
|
|
650
|
+In the sections below you find more information on the built-in middleware.
|
|
651
|
+
|
649
|
652
|
### Authentication
|
650
|
653
|
|
651
|
654
|
Currently there are three types of authentication supported. They all store the authenticated user in the `$_SESSION` super global.
|