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,一经查实,立即删除!

相关文章

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…

手机文件管理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…

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

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

全国小学四则运算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浏览器,搜狗浏览…

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…

靠能力赚大钱,是最最可笑的谎言

很多人其实到现在也没弄明白他们是怎么赚钱的,很多人都会把自己成功归结为能力的结果,事实上这个是最大的可悲……靠能力赚钱,是一个弥天大谎!我自己一直在反思这些年里的很多事情,突然发现所有的成功失败,…

WPF自定义控件与样式(1)-矢量字体图标(iconfont)

原文:WPF自定义控件与样式(1)-矢量字体图标(iconfont)一.图标字体 图标字体在网页开发上运用非常广泛,具体可以网络搜索了解,网页上的运用有很多例子,如Bootstrap。但在C/S程序中使用还不多,字体图标其实就是把矢量图…

css3 loading 效果1

代码&#xff1a; <!doctype html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Document</title> <style> #box{position: relative;margin: 100px;} #box span{display: block;width: 9px;height: …

类成员函数解析

1、 构造函数&#xff1a; &#xff08;1&#xff09; 定义&#xff1a;是一个特殊的成员函数&#xff0c;名字与类名相同&#xff0c;创建类类型对象时&#xff0c;由编译器自动调用&#xff0c;在对象的生命周期内只且只调用一次&#xff0c;以保证每个数据成员都有一…

add-apt-repository cloud-archive:liberty

apt-get update && apt-get upgrade; v

C++ 继承解析

继承 1、概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能。这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#xff0c;体…

[傅里叶变换及其应用学习笔记] 九. 继续卷积的讨论

这份是本人的学习笔记&#xff0c;课程为网易公开课上的斯坦福大学公开课&#xff1a;傅里叶变换及其应用。 卷积在滤波中的应用 浑浊度&#xff08;Turbidity&#xff09;研究是关于测量水的清澈度的研究。大致方法是把光传感器放置到深水区域&#xff0c;然后测量光线的昏暗程…

C++多态相关关问题及虚表剖析

关于C多态的问题&#xff1a;&#xff08;基于Visual Studio 2012编译器&#xff09; 一、多态引入 1、对象的类型&#xff1a; &#xff08;1&#xff09; 静态的类型&#xff1a;对象声明时的类型&#xff0c;在编译的时候确定 &#xff08;2&#xff09; 动态的类型&…