欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kong自定义插件【request-param-sequence】 KongLuarequestparam-sequence 

程序员文章站 2022-04-25 17:49:00
...
1、插件作用
校验请求参数在URI中的顺序,必须按配置的参数顺序来,否则拒绝访问。

2、核心代码
local function decideUriExists(uri_key,uri_value,uri_param_tab)
  local exists = true
  

  local args = ngx.req.get_uri_args()
  for i = 1, #uri_key do
    local each_key = uri_key[i]
    local each_value = uri_value[i]
    local http_uri_key_value = args[each_key]
    if (http_uri_key_value ~= nil)  and  (string.lower(each_value) == string.lower(http_uri_key_value)) then
    -- Nothing to do
    else
      return exists
    end 
  end
  
  local uri_param_tab_len = #uri_param_tab
  local original_uri = ngx.var.request_uri
  local idx_tab = {}
  for i = 1, uri_param_tab_len do
    local local_uri_key=uri_param_tab[i]
    local http_uri_arg_value = args[local_uri_key]
    if (http_uri_arg_value == nil) then
    exists = false
    break
    end
   -- decide key param location and sequence
    local idx_begin = string.find(original_uri, local_uri_key, 1, true)
    if (idx_begin == nil) then
    exists = false
    break
    end
    table.insert(idx_tab,idx_begin)
  end
  if (exists == true) then 
    for i = 1, #idx_tab do
      for j = i+1,#idx_tab do
       -- ngx.say("=i=",idx_tab[i],"=j=",idx_tab[j],"=end=")
        if not (idx_tab[i] < idx_tab[j]) then
        exists = false
        return exists
        end
      end
    end
  end

  return exists
end

3、配置使用

配置示例如下:
uri_keyword_list=>key1,key2
uri_value_list=>value1,value2
uri_param_seqkey_list=>paramKey1,paramKey2,paramKey3,paramKey4,paramKey5

【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:

Kong自定义插件【request-param-sequence】
            
    
    
        KongLuarequestparam-sequence