持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
关于lua
大白话
类似于一个shell的一个脚本语言(虽然Java,go python...都属于脚本语言,但是还是认为偏向于清亮型脚本语言)吧。使用它可以帮助做一下脚本类的判断包括连接数据之类的 操作,感觉实际情况下和redis配合登录或者nginx 相应的业务逻辑或者判断挺多的吧。
官方
其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
业务场景
这篇写这个就是为了简单记录一下自己云系统中配合kong以及redis 进行的初步权限或者白名单权限校验。
以上流程大白话:
在接口请求时,请求先打到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基础入门差不多吧 。
最近状态不对呀!!!!想找个人管着自己学习 ,写博客,锻炼 ...