nginxlua文件服务器权限,通过lua进行nginx的权限控制

nginx_lua的安装

nginx使用luajit进行编译安装

使用openresty进行yum安装

openresty中将lua和nginx进行封装,详情可查看openresty官网

openresty相关启动命令service openresty start

ngx_lua的相关api使用说明及相关使用

ngx_lua的日常使用场景

ngx_lua的执行顺序,可以看这张图

150450447_1_20181225101711219.png

通过nginx直接进行一些值的显示,此处用到的一般是content_by_lua模块,lua 1.9.5版本中是content_by_lua_block

通过nginx作访问权限控制,包括重写等,不过nginx也可以直接重写

ngx_lua的实例

业务场景

老板要求访问一个url时进行用户时作权限控制,有权限者可以查看url,无权限者则直接返回错误

其中开发人员写了一个接口,能通过传入的两个参数(报表名和用户名),返回对应的值

其中实现过程如下

1.登陆入系统lebi.letv.cn中

2.用户需要访问报表链接,其中报表链接均为http://xxx/views/xxx模式

3.访问报表时,nginx先通过lua进行控制,先向开发人员提供的接口http://10.58.91.84:8080/m/api/permission/getSchedulePermission传递报表名和用户名,其中报表名从报表访问链接中获取,用户名从cookie中获取

4.ngx_lua控制访问请求,同时作相关的处理

开发接口返回值说明

开发接口返回值设置三种:

http状态码403为没权限

http状态码200为通过验证

http状态码500为服务错误

相关curl测试状态如下

http 403:

[root@10-110-157-48 conf.d]# curl -i ‘http://10.58.91.84:8080/m/api/permission/getSchedulePermission?username=marility&url=http://a/b/c‘

HTTP/1.1 403 Forbidden

Server: Apache-Coyote/1.1

Content-Type: application/json;charset=UTF-8

Transfer-Encoding: chunked

Date: Thu, 01 Mar 2018 08:26:05 GMT

{"success":false,"errorMsg":"没有权限,请联系管理员"}

http 200:

[root@10-110-157-48 conf.d]# curl -i ‘http://10.58.91.84:8080/m/api/permission/getSchedulePermission?username=letv&url=http://a/b/c‘

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Content-Type: application/json;charset=UTF-8

Transfer-Encoding: chunked

Date: Thu, 01 Mar 2018 09:45:24 GMT

{"Msg":"有权限查看","success"}

http 500:

[root@10-110-157-48 conf.d]# curl -i ‘http://10.58.91.84:8080/m/api/permission/getSchedulePermission?username=letv&url=‘

HTTP/1.1 500 Internal Server Error

Server: Apache-Coyote/1.1

Content-Type: application/json;charset=utf-8

Transfer-Encoding: chunked

Date: Thu, 01 Mar 2018 10:07:03 GMT

Connection: close

{"errorMsg":"java.lang.ArrayIndexOutOfBoundsException: 2","success":false}

以上测试中url中直接传入测试url=http://a/b/c, 实际中应该动态传入访问报表的链接

ngx_lua中的控制

location ~ ^/views {

access_by_lua ‘

local res = ngx.location.capture("/matrix_proxy/m/api/permission/getSchedulePermission", {args={username=ngx.var.cookie_example , url=ngx.var.request_uri}})

if res.status == ngx.HTTP_FORBIDDEN then

ngx.exec("@hello")

elseif res.status == ngx.HTTP_OK then

ngx.exec("@/")

elseif res.status == ngx.HTTP_INTERNAL_SERVER_ERROR then

ngx.exec("@servererror")

else

ngx.exec("@error")

end

‘;}

access_by_lua因为要实现权限控制,所以只能选择access_by_lua,而不能使用content_by_lua

nginx中的lua全文以单引号‘ ‘进行囊括

local res, lua中使用local定义一个变量res

向一个接口发送参数,有两种方法,一种是使用ngx.location.capture方法,另外一种是httpc:request_uri,httpc.request_uri为openresty的第三方模块。 httpc.request_url的api使用说明 , openresty加载第三方模块说明 , 本例中使用capture方法

ngx.location.capture方法不能象httpc:request_uri方法一样直接传入url,而只能是$request_uri,所以此处先进行一层的/matrix_proxy/的封装,而/matrix_proxy通过pass_proxy,将请求反代至接口的服务器ip 10.58.91.84:8080

此处向接口url传递两个参数,因为要传入变量,所以要以{args={ }}的形式来完成。如果使用httpc.request_uri方法的话,应该可以使用lua的..拼接符进行变量与uri的拼接,有兴趣的同学可以自行测试

ngx.var.cookie_COOKIE_KEY 获取用户的cookie的value值,上实例中cookie的key为example。ngx.var.request_uri 获取nginx中的$request_uri值

从api说明中可以看到ngx.location.capture有4个slots,其中一个是res.status

判断res.status的结果与http状态码是否相等,lua中等于判断使用==

lua中多重if判断使用elseif

lua中if完整的语句为 if..else..end

将四种结果均返回进行执行,ngx.exec表示执行后面的location,@hello 中的 @表示nginx内部的传递,不会进行外部的跳转

完整的ngx_lua配制实例

[root@10-110-157-48 conf.d]# cat tableau.conf

upstream backend_lebiTableau {

server 10.110.150.217;

keepalive 100;

}

upstream matrix_proxy_backend {

server 10.58.91.84:8080;

keepalive 100;

}

server {

listen 82;

server_name lebi.letv.cn;

resolver 10.110.220.231;

access_log /tmp/lebitableau.a.log main;

error_log /tmp/lebitableau.error.log ;

location = /favicon.ico {

log_not_found off;

log_subrequest off;

}

location / {

proxy_http_version 1.1;

proxy_set_header Connection "";

proxy_set_header Host $host;

proxy_pass http://backend_lebiTableau;

proxy_send_timeout 18000;

proxy_read_timeout 18000;

proxy_next_upstream error timeout invalid_header http_500;

proxy_connect_timeout 20;

}

location ~ /matrix_proxy/(.*) {

internal;

proxy_pass http://matrix_proxy_backend/$1$is_args$args;

}

location @/ {

proxy_pass http://backend_lebiTableau;

}

location @error {

return 403;

}

location @servererror {

default_type ‘text/plain‘;

content_by_lua ‘ngx.say("server error")‘;

}

location @hello {

rewrite ^(.*)$ http://matrix.lebi.letv.cn/#/error break; ##没有权限的用户全部rewrite至系统错误页面

}

location @ok {

default_type ‘text/plain‘;

content_by_lua ‘ngx.say("authorized ok, cookie=", ngx.var.cookie_78bdfe11ce353909cb210160a76c330b)‘;

}

location ~ ^/views {

access_by_lua ‘

local res = ngx.location.capture("/matrix_proxy/m/api/permission/getSchedulePermission", {args={username=ngx.var.cookie_example , url=ngx.var.request_uri}})

if res.status == ngx.HTTP_FORBIDDEN then

ngx.exec("@hello")

elseif res.status == ngx.HTTP_OK then

ngx.exec("@/")

elseif res.status == ngx.HTTP_INTERNAL_SERVER_ERROR then

ngx.exec("@servererror")

else

ngx.exec("@error")

end

‘;}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WINCC访问OPC服务器显示叹号,本机浏览opcserver.wincc ,无法打开-工业支持中心-西门子中国...

WinCC OPC服务器和OPC客户机之时的数据交换通过DCOM进行。安装WinCC后,WinCC OPC服务器的DCOM要设置正确。如下情况设置必须改变:? 如果登记到OPC客户机或服务器计算机的用户没有管理员员限? 如果用不同于OPC客户机的帐号登记OPC服务器。注意下列说明描…

CSS3 选择器 基本选择器介绍

CSS是一种用于屏幕上渲染html,xml等一种语言,CSS主要是在相应的元素中应用样式,来渲染相对应用的元素,那么这样我们选择相应的元素就很重要了,如何选择对应的元素,此时就需要我们所说的选择器。选择器主要是…

逆水寒7月19服务器维护,逆水寒7月19日更新维护公告 更新内容汇总

3. 战斗体验优化:1) 优化了动作模式下Alt数字快捷键选择队友的操作,我们已经安排大量策划专注使用3D模式和动作模式,后续将继续优化部分技能在3D模式下的易用性。2) 大幅提升部分日常副本的可视距离,现在可看到更远处的…

Linux下ejabberd安装配置

为什么80%的码农都做不了架构师?>>> Linux下ejabberd安装配置 1、下载Ejabberd安装包 wget http://www.process-one.net/downloads/ejabberd/2.1.13/ejabberd-2.1.13-linux-x86_64-installer.run 也可以在直接在官网上下载 ejabberd-15.11-linux-x86…

unity5, custom PBS shader

unity5中引入了基于物理着色(PBS)的Standard shader。由于这种着色器通过调节参数和贴图可逼真模拟各种硬质表面,所以不必再像unity4时代那样需要对各种质感材质单独编写着色器,而且能得到更好的效果(参考:http://docs.unity3d.com/Manual/sh…

win服务器文件夹权限设置密码,win服务器 文件夹权限设置

win服务器 文件夹权限设置 内容精选换一换开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。在OBS中,用户操作的基本数据单元是对象。OBS PHP SDK…

Java定时任务以及ScheduledThreadPoolExecutor需要注意的问题

Java提供Timer和ScheduledThreadPoolExecutor两个类实现定时任务,其中Timer简单易用,但所有任务都是由同一个线程来调度,任务串行执行,任务之间存在互相干扰,一是前一个任务的延迟会导致后面的任务延迟,二是…

重启php-fpm的方法

ps -ef|grep "php-fpm: master process"|grep -v grep|awk {print $2}|xargs kill -USR2 优点:简单,无需写脚本。无需依赖其他工具缺点:不能区分池子,不够精准转载于:https://www.cnblogs.com/yaoyi/p/4398636.html

手机文件管理ftp服务器,ftp工具手机版(ftp文件传输管理工具)V1.0.2 手机版

ftp工具手机版(ftp文件传输管理工具)是一款非常实用的ftp文件管理应用工具。主要作用是将手机ftp上的文件数据快速传输到电脑上,或者将电脑上的文件传输到手机上,实现双向传输,并且传输速度十分快,ftp工具是一款很专业的传输软件&…

Android 获得ImageView中Image的绘制大小

2019独角兽企业重金招聘Python工程师标准>>> ImageView在显示图片的时候,受限于屏幕大小,和图片宽高。通常图片是被缩放过,且不是宽和高都充满ImageView的。 此时,我们如何获得Image被实际绘制的宽高呢? //…

Quartz2D指定显示范围

在qq中,可以看到头像是圆形显示的,通过CGContextClip可以设置 CGContextRef contextUIGraphicsGetCurrentContext();CGContextAddEllipseInRect(context, CGRectMake(100, 100, 100, 100));CGContextClip(context);UIImage *img[UIImage imageNamed:&quo…

当前系统时间与服务器时间,操作系统时间和服务器时间

操作系统时间和服务器时间 内容精选换一换文章目录计算机操作系统(一)1 操作系统的目标和作用1.1 操作系统的目标 1.2 操作系统的目标 2 操作系统的发展历程2.1 未配置操作系统的计算机2.2 单道批处理系统2.3 多道批处理系统2.4 分时系统2.5 实时系统 3 操作系统的基本特性3.1 …

【学神-RHEL7】1-3-Linux基本命令和配置服务器来电后自动开机

本节所讲内容:Linux终端介绍Shell提示符Bash Shell基本语法基本命令的使用:ls、pwd、cd查看系统和BIOS硬件时间Linux如何获得帮助Linux关机命令:shutdow、init等Linux 7个启动级别创建一个方便快捷实验环境快照设置服务器在来电后自动开机Lin…

服务器节点信息管理,华为云管理节点服务器

华为云管理节点服务器 内容精选换一换不想看文字,请直接戳视频链接。可以不做备案吗?根据《互联网信息服务管理办法》等相关规定,使用中国大陆节点服务器开办的网站,必须先办理网站备案,备案成功并获取通信管理局下发的…

C/C++心得-结构体

先说句题外话,个人认为,基本上所有的高级语言被设计出来的最终目的是降低软件开发难度,提升软件开发人员素质和团队协作能力,降低软件维护的难度。在学习语言的时候,可以从这么方面来推测各种语言语法设计的原因&#…

全国小学四则运算1.0

程序:全国小学四则运算1.0 源代码: import javax.swing.*; import java.awt.*; import java.awt.event.*; //一开始的界面 public class Menu extends JFrame implements ActionListener{JButton enter;public Menu(){super("小学生四则运算大考验&…

Chrome开发者工具详解

作为一名前端开发者,打交道最多的可能是和浏览器。市面上各种浏览器多不胜数,主流的有Chrome,Firefox,Safari,IE,Opera,非主流的如360,遨游,QQ浏览器,搜狗浏览…

SRAM与SDRAM的区别

http://www.cnblogs.com/spartan/archive/2011/05/06/2038747.html SDRAM SDRAM(Synchronous Dynamic Random Access Memory)同步动态随机存取存储器,同步是指Memory工作需要步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵…

redis学习笔记-安装与入门

Linux下安装redis mkdir /usr/local/redis && cd /usr/local/redis 下载:wget http://download.redis.io/releases/redis-3.0.5.tar.gz 解压:tar xzf redis-3.0.5.tar.gz 安装到指定目录: cd redis-3.0.5 make PREFIX/usr/local/red…

python多列排序

python的sort()和sorted()函数可以进行多列排序。在一个文本或者列表有多列时,这是一个很好用的技巧。 首先,看一下待排序的数据 这是一个csv文件,它有6列,我们需要首先对第一列排序,再对第六列排序 46896961,19210048…