Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制_方志朋的博客-CSDN博客


本站和网页 https://blog.csdn.net/forezp/article/details/78616779 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制_方志朋的博客-CSDN博客
Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制
方志朋
于 2017-11-23 17:02:28 发布
44714
收藏
14
分类专栏:
lua+nginx
OpenResty 最佳案例
文章标签:
nginx
lua
api
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/forezp/article/details/78616779
版权
lua+nginx
同时被 2 个专栏收录
11 篇文章
6 订阅
订阅专栏
OpenResty 最佳案例
10 篇文章
67 订阅
订阅专栏
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616779 本文出自方志朋的博客
个人博客纯净版:https://www.fangzhipeng.com/openresty/2018/01/01/openresty-best-practice-9-api-gateway.html
简介
采用openresty 开发出的api网关有很多,比如比较流行的kong、orange等。这些API 网关通过提供插件的形式,提供了非常多的功能。这些组件化的功能往往能够满足大部分的需求,如果要想达到特定场景的需求,可能需要二次开发,比如RBAC权限系统。本小节通过整合前面的知识点,来构建一个RBAC权限认证系统。
技术栈
本小节采用了以下的技术栈:
Openresty(lua+nginx)mysqlrediscjson
验证流程
用户请求经过nginx,nginx的openresty的模块通过拦截请求来进行权限判断 openresty的access_by_lua_file模块,进行了一系列的判断
用户的请求是否为白名单uri,如果为白名单uri,则直接通过验证,进入下一个验证环节content_by_lua_file,这个环节直接打印一句话:“恭喜,请求通过。”如果用户请求不为白名单url,则需要取出请求header中的token,如果请求的header不存在token,则直接返回结果401,无权限访问。如果用户请求的uri的请求头包含token ,则取出token,解密token取出用户id根据取出的userid去查询数据库获取该用户的权限,如果权限包含了该请求的uri,请求可以通过,否则,请求不通过。 请求如果通过access_by_lua_file模块,则进入到content_by_lua_file模块,该模块直接返回一个字符串给用户请求,在实际的开发中,可能为路由到具体的应用程序的服务器。
验证流程图如下所示:
vim /usr/example/example.conf ,加上以下的配置:
location / {
default_type "text/html";
access_by_lua_file /usr/example/lua/api_access.lua;
content_by_lua_file /usr/example/lua/api_content.lua;
以上的配置表示,要不符合已有location路径的所有请求,将走这个location为/ 的路径。符合这个location的请求将进入 access_by_lua_file和 content_by_lua_file的模块判断。
vim /usr/example/lua/access_by_lua_file ,加上以下代码:
local tokentool = require "tokentool"
local mysqltool = require "mysqltool"
function is_include(value, tab)
for k,v in ipairs(tab) do
if v == value then
return true
end
end
return false
end
local white_uri={"/user/login","/user/validate"}
--local user_id = ngx.req.get_uri_args()["userId"]
--获取header的token值
local headers = ngx.req.get_headers()
local token=headers["token"]
local url=ngx.var.uri
if ( not token) or (token==null) or (token ==ngx.null) then
if is_include(url,white_uri)then
else
return ngx.exit(401)
end
else
ngx.log(ngx.ERR,"token:"..token)
local user_id=tokentool.get_user_id(token)
if (not user_id) or( user_id ==null) or ( user_id == ngx.null) then
return ngx.exit(401)
end
ngx.log(ngx.ERR,"user_id"..user_id)
local permissions={}
permissions =tokentool.get_permissions(user_id)
if(not permissions)or(permissions==null)or( permissions ==ngx.null) then
permissions= mysqltool.select_user_permission(user_id)
if permissions and permissions ~= ngx.null then
tokentool.set_permissions(user_id,permissions)
end
end
if(not permissions)or(permissions==null)or( permissions ==ngx.null) then
return ngx.exit(401)
end
local is_contain_permission = is_include(url,permissions)
if is_contain_permission == true then
-- ngx.say("congratuation! you have pass the api gateway")
else
return ngx.exit(401)
end
end
在上述代码中:
is_include(value, tab),该方法判断某个字符串在不在这个table中。white_uri={"/user/login","/user/validate"} 是一个白名单的列表。local headers = ngx.req.get_headers()从请求的uri的请求头获取tokenis_include(url,white_uri)判断该url是否为白名单urllocal user_id=tokentool.get_user_id(token)根据token获取该token对应的用户的user_id,在常见情况下,是根据token解析出user_id,但在不同的语言加密和加密token存在盐值不一样的情况,比较麻烦,所以我偷了个懒,直接存了redis,用户登录成功后存一下。permissions =tokentool.get_permissions(user_id)根据user_id 从redis获取该用户的权限。permissions= mysqltool.select_user_permission(user_id)如果redis没有存该用户的权限,则从数据库读。tokentool.set_permissions(user_id,permissions),将从数据库中读取的权限点存在reddis中。local is_contain_permission = is_include(url,permissions),判断该url 在不在该用户对应的权限列表中。
如果所有的判断通过,则该用户请求的具有权限访问,则进入content_by_lua_file模块,直接在这个模块给请求返回“congratulations! you have passed the api gateway”。
vim /usr/example/lua/api_content.lua ,添加以下内容:
ngx.say("congratulations!"," you have passed ","the api gateway")
----200状态码退出
return ngx.exit(200)
验证演示
打开浏览器访问http://116.196.177.123/user/login,浏览器显示:
congratulations! you have passed the api gateway
/user/login这个url 在白名单的范围内,所以它是可以通过权限验证的。
打开浏览器访问http://116.196.177.123/user/sss,显示以下内容:
401 Authorization Required
openresty/1.11.2.4
在redis中添加一对key-value,key为token_forezp,value为1,即token_forezp对应的用户的id为1.
/usr/servers/redis-3.2.6
src/redis-cli
set token_forezp 1
初始化以下的sql脚本,即给用户id为1的用户关联角色,角色并关联权限:
INSERT INTO `permission` VALUES ('1', '/user/orgs');
INSERT INTO `role` VALUES ('1', 'user');
INSERT INTO `role_permission` VALUES ('1', '1', '1');
INSERT INTO `user` VALUES ('1', 'forezp');
INSERT INTO `user_role` VALUES ('1', '1', '1');
用postman请求,在请求头中加入token,值为token_forezp,请求结果如下:
更多阅读
史上最简单的 SpringCloud 教程汇总
SpringBoot教程汇总
Java面试题系列汇总
扫码关注公众号有惊喜
(转载本站文章请注明作者和出处 方志朋的博客)
方志朋
关注
关注
点赞
14
收藏
打赏
评论
Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制
简介采用openresty 开发出的api网关有很多,比如比较流行的kong、orange等。这些API 网关通过提供插件的形式,提供了非常多的功能。这些组件化的功能往往能够满足大部分的需求,如果要想达到特定场景的需求,可能需要二次开发,比如RBAC权限系统。本小节通过整合前面的知识点,来构建一个RBAC权限认证系统。技术栈本小节采用了以下的技术栈:Openresty(lua+nginx)mys
复制链接
扫一扫
专栏目录
lua-resty-hawk:使用Lua和OpenResty在Nginx上进行Hawk身份验证
04-29
lua-resty-hawk
使用Lua和在Nginx上进行身份验证
是一种HTTP身份验证方案,使用消息身份验证代码(MAC)算法来提供部分HTTP请求密码验证。
使用范例
首先,创建一个Lua脚本来获取凭证,例如'credentials.lua':
local ngx = ngx
local artifacts = ngx. ctx . artifacts
-- At this point, artifacts has the following keys :
-- id, method, host, port, resource, ts, nonce, hash, ext, app, dlg, mac
-- Use what you want in order to find the key needed to check the MAC
if not artifacts. i
ProxyGatewayPGW基于openresty开发可以作为接口网关使用
08-12
PGW(Proxy Gateway) Proxy Gateway基于openresty(nginx-lua-module)开发,可以作为接口网关(api gateway)使用,整合业务模块接口,微服务治理聚合,通过web配置界面,能够轻松进行代理配置管理,支持负载均衡,服务器状态检测。
评论 3
您还未登录,请先
登录
后发表或查看评论
使用idea编写和运行lua脚本
最新发布
weixin_42128648的博客
11-07
337
用idea来写lua程序
基于OpenResty的弹性网关实践(一)
yfy的博客
09-25
313
一、介绍
1. OpenResty简介
官方地址:http://openresty.org/cn/
github地址:https://github.com/openresty/
OpenResty最佳实践:https://moonbingbing.gitbooks.io/openresty-best-practices/content/
OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便.
openresty版本的nginx+lua实现接口签名安全认证
reblue520的专栏
08-27
3178
一)需求背景现在app客户端请求后台服务是非常常用的请求方式,在我们写开放api接口时如何保证数据的安全,我们先看看有哪些安全性的问题请求来源(身份)是否合法?请求参数被篡改?请求的唯一性(不可复制)二)为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证案例:我们通过给某 [移动端(app)] 写 [后台接口(api)] 的案例进行分析: 客户端: 以下简...
8.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 指标监控与报警
enlyhua的专栏
07-17
189
第 8 章 指标监控与报警 
常见的监控指标有,cpu使用率,内使用率,GC,磁盘IO,网络流量,网络延迟,请求速度,请求排队,链接数,用户态与内核态的上下文切换等。
指标监控和报警主要分为以下6个方面:
1.采集指标数据
2.存储指标数据
3.分析指标数据
4.展示指标数据
5.监控指标数据
6.报警处理
8.1 Kong 的监控指标 
8.2 Prometheus 
开源的监控,报警,时间序列数据库的组合。
8.2.1 安装 
8.2.2 配置 
8.2..
OpenResty第八篇: Openresty实现的网关权限控制
yangsen159的博客
07-26
2399
简介
采用openresty 开发出的api网关有很多,比如比较流行的kong、orange等。这些API 网关通过提供插件的形式,提供了非常多的功能。这些组件化的功能往往能够满足大部分的需求,如果要想达到特定场景的需求,可能需要二次开发,比如RBAC权限系统。本小节通过整合前面的知识点,来构建一个RBAC权限认证系统。
技术栈
本小节采用了以下的技术栈:
Openresty(lua+nginx...
Openresty最佳解读 | 第9篇:Openresty实现的网关权限控制
常年被追砍的博客
07-13
630
简介
采用openresty 开发出的api网关有很多,比如比较流行的kong、orange等。这些API 网关通过提供插件的形式,提供了非常多的功能。这些组件化的功能往往能够满足大部分的需求,如果要想达到特定场景的需求,可能需要二次开发,比如RBAC权限系统。本小节通过整合前面的知识点,来构建一个RBAC权限认证系统。
技术栈
本小节采用了以下的技术栈:
Openresty(lua+nginx)
mysql
redis
cjson
验证流程
用户请求经过nginx,nginx的ope
nginx+lua(openresty)实现黑/白名单权限控制
lgq2016的博客
01-18
2819
openresty在nginx基础上集成了很多功能,比如可以直接调用redis,mysql,http接口等服务,比较流行的网关kong就是通过openresty实现的。日常开发和运维离不开nginx,实现稍微复杂的功能:简单权限控制,灰度发布等就可以通过openresty实现。
本文通过openresty定时器定期请求http接口获取更新的黑名单数据,过滤用户并做进一步的判断(结合实际的业务需求)进行权限管控。话不多说,直接上nginx.conf代码如下。
user ...
网关技术选型,为什么选择 Openresty ?事件驱动、协程...
weixin_44742132的博客
11-19
80
大家好,我是Tom哥~今天跟大家聊下关于网关的话题互联网公司,不论体量大小如何,其内部的技术架构基本都是相似的,体现在以下几个方面:数据量过大,如何定制化存储访问量高了,如何集群化部署,流...
高频访问IP限制 --Openresty(nginx + lua) [反爬虫之旅]
Silbert Monaphia
08-25
6663
前言嗯….本人是从写爬虫开始编程的,不过后面做web写网站去了,好了,最近web要搞反爬虫了,哈哈哈,总算有机会把之以前做爬虫时候见识过的反爬一点点给现在的网站用上了~ 做爬虫的同志,有怪莫怪喽~还有求别打死 > <首先要提一下AJAX,现在普天下网页几乎都是往特定的数据接口请求数据了,除了什么首屏渲染这种服务端渲染好html以外,几乎没有什么静态网页了。我看了有一些帖子说AJAX让爬虫难做,可是我
OpenResty获取微信公众号access_token
chouzu8463的博客
03-17
186
由于要实现公众号的各种功能首先是要获取access_token,这个access_token并不是最初填写服务器的token,而是需要appid和secret去微信服务器申请的。
其次就是OpenResty本身要发起http请求是一件比较麻烦的事情,还好有春哥写了个lua_r...
lua为什么喜欢和nginx一起做鉴权等业务呢?
度窝-笔记
10-16
187
lua为什么喜欢和nginx一起做鉴权等业务呢?
因为nginx本身高性能,而且nginx worker采用c语言编写,可以高性能的执行小部分业务逻辑(主要是对本地缓存做业务逻辑)。但是nginx基于c的插件拓展口不大友好。而lua作为一种语法糖,恰好可以弥补这个缺点。
我们可以利用Lua语法编写nginx插件,让部分业务在nginx运行(反正nginx运行那么快,找点小业务拖一拖它的性能一点都不过分,据说Nginx单机压测能到3万tps。)
lua可以做一些针对request请求包的安全检测,甚至可以通过
Orange--------基于nginx/openresty之API网关(Gateway)实战
weixin_34384915的博客
11-09
999
Orange 简介
Orange是一个基于OpenResty的API网关。除Nginx的基本功能外,它还可用于API监控、访问控制(鉴权、WAF)、流量筛选、访问限速、AB测试、动态分流等。它有以下特性:
提供了一套默认的Dashboard用于动态管理各种功能和配置
提供了API接口用于实现第三方服务(如个性化运维需求、第三方Dashboard等)...
Openresty
zhangxm_qz的博客
02-25
1734
OpenResty 是一个通过 Lua 扩展 Nginx 实现的可伸缩的 Web 平台,内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
Openresty安装
安装文件 下载地址 :https://download.csdn.net/my 或者 https://openresty.org/c...
OpenResty 最佳实践
bujidexinq的专栏
02-16
444
OpenResty 最佳实践
https://moonbingbing.gitbooks.io/openresty-best-practices/content/ OpenResty 最佳实践
在 2012 年的时候,加入到奇虎 360 公司,为新的产品做技术选型。由于之前一直混迹在 Python 圈子里面,也接触过 Nginx C 模块的高性能开发,一直想找到一个兼备 Python ...
openresty服务管理框架(API网关)
Mental_history_T的博客
06-05
497
tl-ops-manage (tl-openresty-web-manage),基于openresty开发的一款基础服务管理工具,支持服务动态扩展,自定义URL路由,健康检查,服务熔断限流,动态配置检测,日志记录,数据版本控制,后台可视化管理,等等….....................
openresty 网关rsa+aes+redis鉴权解密
胡汉三
07-11
635
之前使用了openresty进行了rsa跟aes的加解密测试。现在我们整合一下、使用openresty连接redis做鉴权、解密。之前提到过,我们不使用cookie而是使用token来认证用户信息。而且token是我们自己加密的、加密的规则就是使用aes进行加密。我们再来缕一缕整个流程。客户端(浏览器)流程: 第一步:先获取token(临时token),返回的token是aes加密的,这里的密钥我们就使用固定的aes密钥就好了。token里面包含userId跟tokenId,我们使用token
OpenResty实战应用
一个有趣、有料、有内涵的地方!
09-06
1156
什么是OpenResty?
OpenResty官网描述如下:
...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:编程工作室
设计师:CSDN官方博客
返回首页
方志朋
CSDN认证博客专家
CSDN认证企业博客
码龄7年
Java领域优质创作者
198
原创
6122
周排名
196万+
总排名
1627万+
访问
等级
3万+
积分
2万+
粉丝
6219
获赞
6916
评论
1万+
收藏
私信
关注
热门文章
史上最简单的 SpringCloud 教程 | 终章
1933434
史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
901380
史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
546197
史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)
516353
史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)
469608
分类专栏
史上最简单的 Spring Cloud 教程
56篇
SpringBoot 非官方教程
30篇
linux
4篇
跟我学springboot开发后端管理系统
9篇
数据库中间件
4篇
Docker专栏
6篇
OpenResty 最佳案例
10篇
Java面试专栏
9篇
springcloud
67篇
springboot
29篇
docker
6篇
kubernetes
5篇
java
26篇
Java并发编程
2篇
lua+nginx
11篇
分布式
13篇
rxjava
4篇
python
2篇
工具
1篇
elk
4篇
mongodb
1篇
架构
26篇
redis
4篇
android
18篇
生活感悟
5篇
javascript
9篇
面试
spring
2篇
数据库
4篇
最新评论
史上最简单的 SpringCloud 教程 | 终章
诛九戒:
看完您的博客后,我的心久久不能平静!这条说说构思新颖,题材独具匠心,段落清晰,情节诡异,跌宕起伏,主线分明,引人入胜,平淡中显示出不凡的文学功底,可谓是字字珠玑,句句经典,是我辈应学习之典范。就小说艺术的角度而言,可能不算太成功,但它的实验意义却远大于成功本身。一马奔腾,射雕引弓,天地在我心中!您不愧为无厘头界新一代开山怪!是你让我的心里重燃起希望之火,这是难得一见的好说! 苍天有眼,让我在有生之年能观得如此精彩说说!真如"大音希声扫阴翳",犹如"拨开云雾见青天",使我等之辈看到希望,晴天霹雳,醍醐灌顶,不足以形容大师文章的构思;巫山行云,长江流水更难比拟大师的文才!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾,龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔,写天下文章的智慧神态;仿佛看见了你按剑四顾,江山无数的英武气概!你说的多好啊! 我在网上打滚这么多年,所谓阅人无数,见怪不怪了,但一看您的气势,我就觉得您与在网上灌水的那帮小混蛋有着本质的差别,那忧郁的语调,那熟悉的签名,那高屋建瓴的辞藻,就足以证明您的伟大。是您让中华民族精神得以弘扬。佩服佩服。
SpringCloud 2020版本教程1:使用nacos作为注册中心和配置中心
北遇长街:
直接点击startup.cmd启动失败,使用命令启动成功startup.cmd -m standalone
如何使用MongoDB+Springboot实现分布式ID?
qq_31459039:
同问: 如果是用的mysql能用mongo生成唯一id么? 是不是必须先save一下?
Java NIO?看这一篇就够了!
hjkjghgh520123:
文不对题,走哪儿凑的
跟我学Springboot开发后端管理系统1:概述
十号男:
现在网站进不去了是怎么回事啊,有没有能解答下的,换域名了?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
SpringCloud 2020版本教程4:使用spring cloud sleuth+zipkin实现链路追踪
SpringCloud 2020版本教程3:使用sentinel作为熔断器
SpringCloud 2020版本教程2:使用spring cloud gateway作为服务网关
2021年6篇
2020年16篇
2019年55篇
2018年34篇
2017年83篇
2016年43篇
目录
目录
分类专栏
史上最简单的 Spring Cloud 教程
56篇
SpringBoot 非官方教程
30篇
linux
4篇
跟我学springboot开发后端管理系统
9篇
数据库中间件
4篇
Docker专栏
6篇
OpenResty 最佳案例
10篇
Java面试专栏
9篇
springcloud
67篇
springboot
29篇
docker
6篇
kubernetes
5篇
java
26篇
Java并发编程
2篇
lua+nginx
11篇
分布式
13篇
rxjava
4篇
python
2篇
工具
1篇
elk
4篇
mongodb
1篇
架构
26篇
redis
4篇
android
18篇
生活感悟
5篇
javascript
9篇
面试
spring
2篇
数据库
4篇
目录
评论 3
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
方志朋
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值