Plugin Development - Plugin Configuration
The configuration consists of a Lua table in Kong that we call a schema. It contains key/value properties that the user will set when enabling the plugin through the Admin API. Kong provides you with a way of validating the user’s configuration for your plugin.
Your plugin’s configuration is being verified against your schema when a user issues a request to the to enable or update a plugin on a given Service, Route, or Consumer.
For example, a user performs the following request:
If all properties of the object are valid according to your schema, then the API would return 201 Created
and the plugin would be stored in the database along with its configuration:
{
foo = "bar"
}
If the configuration is not valid, the Admin API would return 400 Bad Request
and the appropriate error messages.
kong.plugins.<plugin_name>.schema
This module is to return a Lua table with properties that will define how your plugins can later be configured by users. Available properties are:
In most of the cases you can ignore most of those and use the defaults. Or let the user specify value when enabling a plugin.
Here is an example of a potential schema.lua
file (with some overrides applied):
The config.fields
property of your schema.lua
file describes the schema of your plugin’s configuration. It is a flexible array of field definitions where each field is a valid configuration property for your plugin, describing the rules for that property. For example:
{
name = "<plugin-name>",
fields = {
config = {
type = "record",
fields = {
{
some_string = {
type = "string",
required = false,
},
},
{
some_boolean = {
type = "boolean",
default = false,
},
},
{
some_array = {
type = "array",
elements = {
type = "string",
one_of = {
"GET",
"POST",
"PUT",
"DELETE",
},
},
},
},
},
},
}
Here is the list of some common (not all) accepted rules for a property (see the fields table above for examples):
There are many more, but the above are commonly used.
You can also add field validators, to mention a few:
This schema.lua
file is for the key-auth plugin:
-- schema.lua
local typedefs = require "kong.db.schema.typedefs"
return {
name = "key-auth",
{
consumer = typedefs.no_consumer
},
{
protocols = typedefs.protocols_http
},
{
config = {
type = "record",
fields = {
{
key_names = {
type = "array",
required = true,
elements = typedefs.header_name,
default = {
"apikey",
},
},
},
{
hide_credentials = {
type = "boolean",
default = false,
},
},
{
anonymous = {
type = "string",
uuid = true,
legacy = true,
},
{
key_in_body = {
type = "boolean",
default = false,
},
},
{
run_on_preflight = {
type = "boolean",
default = true,
},
},
},
},
},
},
}
Hence, when implementing the access()
function of your plugin in and given that the user enabled the plugin with the default values, you’d have access to:
Note that the above example uses the kong.log.inspect function of the to print out those values to the Kong logs.
A more complex example, which could be used for an eventual logging plugin:
local typedefs = require "kong.db.schema.typedefs"
return {
name = "my-custom-plugin",
fields = {
{
config = {
type = "record",
fields = {
{
environment = {
type = "string",
required = true,
one_of = {
"production",
"development",
},
},
},
{
server = {
type = "record",
fields = {
{
host = typedefs.host {
default = "example.com",
},
},
{
port = {
type = "number",
default = 80,
between = {
0,
65534
},
},
},
},
},
},
},
},
},
},
}
Such a configuration will allow a user to post the configuration to your plugin as follows:
$ curl -X POST http://kong:8001/services/<service-name-or-id>/plugins \
-d "name=my-custom-plugin" \
And the following will be available in handler.lua:
Next: