lua 连接redis + kong lua 权限校验脚本思路

484 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

关于lua

大白话

类似于一个shell的一个脚本语言(虽然Java,go python...都属于脚本语言,但是还是认为偏向于清亮型脚本语言)吧。使用它可以帮助做一下脚本类的判断包括连接数据之类的 操作,感觉实际情况下和redis配合登录或者nginx 相应的业务逻辑或者判断挺多的吧。

官方

image.png 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

业务场景

这篇写这个就是为了简单记录一下自己云系统中配合kong以及redis 进行的初步权限或者白名单权限校验。

image.png 以上流程大白话:

在接口请求时,请求先打到kong上面配置的 plugin 插件上面 然后会执行相应的handler.lua脚本进行相应的判断:

  • 判断①: 白名单接口校验
  • 判断②: 校验redis 是否存在请求的相关 token
  • 其他处理: 不存的话网关错误拦截 | 存在 可以预设相关的请求参数 like 相关header 信息

以上属于个人理解!!!!

连接语法

lua 白名单校验

  local white_list = { ["/app/login"] = true, ["/test/app"] = true}
  local url = ngx.var.upstream_uri
  ngx.req.set_header("R_PG_TID", "this is a fake TID V3!")
  if (tableHasKey(white_list,url) == false) then
    --内部逻辑处理
  end

使用lua连接 redis + 非白名单接口权限校验

          --拉取 redis 请求
          local redis = require 'resty/redis'
          local red = redis:new()
          red:set_timeout(1000)
		 
          local ok, err = red:connect('ip',6379)
          if not ok then
                  return kong.response.exit(500, [[{"message":"Server Error!"}]], {
                        ["Content-Type"] = "application/json"
          })
          end
          --设置redis 鉴权用户密码问题 切记密码需要单引号!!!!
		  red:auth('password')
          --通过header 进行数据库选择
          if(kong.request.get_header("XX-Header") == nil) then
                  red:select(1)
          elseif(kong.request.get_header("XX-Header") == 'test') then
                  red:select(11)
          else
                  red:select(15)
          end
          -- redis 非白名单接口权限校验 及获取相应的redis存储的用户权校校验
         local hasAuth = red:sismember('prex:'..kong.request.get_header("token"),"\""..url.."\"")
      
          if(hasAuth==0) then
                  return kong.response.exit(403, [[{"message":"No Auth, 没有权限!"}]], {
                        ["Content-Type"] = "application/json"
                  })
          end
          local list = red:lrange('t:'..kong.request.get_header("token"),0,-1)
          kong.service.request.set_header("X-U", list[3])
          kong.service.request.set_header("X-A", list[2])
          kong.service.request.set_header("X-B", list[1])

end

个人也是一个lua 语言的小白哈,只是在使用的过程中遇见了并且解决了相应的问题,一个比较小巧的语言其实看了一下菜鸟教程和python基础入门差不多吧 。

最近状态不对呀!!!!想找个人管着自己学习 ,写博客,锻炼 ...

image.png