ngx_lua实现登录逻辑
最近在公司做一个简单的portal,本来很简单的,只用ngx_lua就可以实现所有的业务逻辑,不需要upstream上游服务。但被要求接入公司内部的用户校验系统,说白了就是一个登录过程,只允许公司内部的用户可以登录访问。
公司内部有一整套组件,只要在业务代码里嵌入改组件,就能自动检测用户是否已经登录、或session是否过期,是则跳转到登录界面,用户输入密码验证后,重新跳转会原始访问的页面。
但公司提供的组件都是基于常用的业务语言的,如php、java,我也不想再加上这些玩意,于是考虑用ngx_lua实现这样一套登录逻辑。下面是一个测试配置,基本总结了nginx中实现登录的方法。
lua_shared_dict stats 10m;
init_by_lua '
local stats = ngx.shared.stats
stats:set("flag",)
'; server {
listen so_keepalive=on; set $flag ;
rewrite_by_lua '
local stdo = string.match(ngx.var.uri, "(%a+%.do)")
if stdo == nil then
local res = ngx.location.capture("/isLoginExpired.do")
ngx.var.flag = res.body
end
'; location /isLoginExpired.do {
content_by_lua '
local stats = ngx.shared.stats
local flag = stats:get("flag")
ngx.print(flag)
';
} location / { content_by_lua '
if ngx.var.flag == "" then
local query = "backuri="..ngx.var.request_uri
query = string.gsub(query,"&","%%26")
return ngx.redirect("/redirect?"..query, )
else
local new_uri = "/fcgi"..ngx.var.request_uri
ngx.exec("/fcgi")
end
'; } location /redirect {
content_by_lua '
local stats = ngx.shared.stats
-- do login or update cookies, and then flag=0
stats:set("flag",)
local backuri = ngx.var.arg_backuri
return ngx.redirect(backuri, )
';
} location /fcgi {
content_by_lua '
ngx.say(ngx.var.request_uri)
ngx.say("come into fcgi")
ngx.say(ngx.var.flag)
ngx.say(ngx.var.right)
';
} }
这里用共享内存 stats:flag模拟是否登录的标志位,初始为1,表示未登录。
对于所有请求,首先用一段rewrite_by_lua代码来判断是否登录,这里主要就是查看stats:flag的值,其中可以利用ngx_lua提供的强大的子请求功能。这里要注意的是,所用子请求的uri一定要排除在要判断登录态请求之外(即该/isLoginExpired.do请求不能再去判断登录态,否则会造成死循环)。
之后所有请求进入 location / {...},这里主要利用前面判断的结果(ngx.var.flag的值,不要和那个stats:flag混淆了,名字没起好),没有登录,则利用ngx.redirect()做302跳转,跳转到登录界面,用户可以输入密码,这里简单的模拟了一下,直接把stats:flag置0,并且添加query语句,带上backuri字段。
一般登录应用中,都会读取backuri字段,登录认证后,重新302到该backuri。例子中的location /redirect {...} 就是模拟了这样一个登录应用。
请求重新来之后,进入location / {...}, 判断已登录,则通过ngx.exec()直接内部跳转到具体的业务location。
一开始的时候还是觉得比较绕的,理清楚之后还是比较简洁的,这里面用到ngx_lua的几个强大的功能,也是一次很好的实践
ngx.location.capture() 子请求
ngx.redirect() 等同于nginx原生的rewrite .. .. redirect (302跳转)
ngx.exec() 等同于nginx原生的rewrite .. .. break (内部跳转)
运行结果如下

不当之处,欢迎指正
ngx_lua实现登录逻辑的更多相关文章
- 网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述
上一篇文章网站实现微信登录之嵌入二维码中描述了如何在自己的登录页面内嵌入登录二维码,今天的这篇文章主要是描述下在扫码成功之后微信重定向回网站后登录逻辑的处理,其实也就是验证身份信息,授权用户登录的逻辑 ...
- 1、IOS开发--iPad之仿制QQ空间(登录界面搭建+登录逻辑实现)
开始搭建登录界面 登录界面效果图: 相关的图片资源下载百度云备份链接: http://pan.baidu.com/s/1o71cvMU 密码: 2h7e 步骤开始: 设置辅助窗口的位置在下方 快捷键o ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第七节--登录逻辑及abp封装的Javascript函数库
经过前几节,我们已经解决数据库,模型,DTO,控制器和注入等问题.那么再来看一下登录逻辑.这里算是前面几节的一个初次试水. 首先我们数据库已经有的相应的数据. 模型和DTO已经建好,所以我们直接在服务 ...
- django登录逻辑
django-restframework中已经实现了登录逻辑,只需要安装配置就可以使用 pip install djangorestframework-jwt REST_FRAMEWORK = { ' ...
- ASP.NET WebAPI 双向token实现对接小程序登录逻辑
最近在学习用asp.net webapi搭建小程序的后台服务,因为基于小程序端和后台二者的通信,不像OAuth(开放授权),存在第三方应用.所以这个token是双向的,一个是对用户的,一个是对接口的. ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第七节--登录逻辑及几种abp封装的Javascript函数库
返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 简介 经过前几节,我们已经解决数据库,模型,DTO,控制器和注入等问题.那么再来看一下登录逻辑.这 ...
- [py][mx]django处理登录逻辑
浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...
- tp 例子=登录逻辑
<?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller{ ...
- SpringBoot29 登录逻辑、登录状态判断
1 知识点扫盲 浏览器和服务器之间时通过session来确定连接状态的,浏览器第一次请求时服务端会自动生成一个session,并将这个sessionId传回给浏览器,浏览器将这个sessionId存放 ...
随机推荐
- linux虚拟机磁盘不够用以及进行扩容时遇到的问题
我使用的是:gparted live cd工具 系统是centOS6.2 使用gparted live cd工具进行无损分区,方法很简单,下载iso文件都在VMware对应的linux系统上设置CD ...
- s12-day01-work02 python多级菜单展示
README # README.md # day001-work-2 @南非波波 功能实现:多级菜单展示 流程图:  程序实现: ...
- hdoj2191 珍惜现在,感恩生活(01背包 || 多重背包)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2191 思路 由于每种大米可能不止一袋,所以是多重背包问题,可以直接使用解决多重背包问题的方法,也可以将 ...
- 300万大奖:欢迎参加美团联合主办的全球AI挑战赛
2018年8月29日,由美团.创新工场.搜狗.美图联合主办的“AI Challenger 2018全球AI挑战赛”正式启动.美团CTO罗道峰.创新工场CEO李开复.搜狗CEO王小川和美图CEO吴欣鸿共 ...
- android 打开 res raw目录 中 数据库文件
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 安卓不能直接打开 res raw 中的 数据库 文件. 通过 资源 获取资源 方法 , ...
- loj#2721. 「NOI2018」屠龙勇士
题目链接 loj#2721. 「NOI2018」屠龙勇士 题解 首先可以列出线性方程组 方程组转化为在模p意义下的同余方程 因为不保证pp 互素,考虑扩展中国剩余定理合并 方程组是带系数的,我们要做的 ...
- luoguP4492 [HAOI2018]苹果树 组合计数 + dp
首先,每个二叉树对应着唯一的中序遍历,并且每个二叉树的概率是相同的 这十分的有用 考虑\(dp\)求解 令\(f_i\)表示\(i\)个节点的子树,根的深度为\(1\)时,所有点的期望深度之和(乘\( ...
- 【20181103T1】地球发动机【dp优化】
题面 一眼dp 设\(f_i\)表示前\(i\)个且\(i\)必须选的最大功率 有 \(f _i= max_{1 \leq j < i,A_i - A_j > X_j} \{f_j \}+ ...
- [CSAcademy]Cycle Tree
[CSAcademy]Cycle Tree 题目大意: 定义环树是一张无向连通的简单图,它的生成方式如下: \(2\)个点\(1\)条边的图是环树: 对任意一个环树,加入\(k\)个点\(a_{1\s ...
- Windows Phone background Audio 后台音频
Windows Phone 后台音频的确不是什么新鲜的话题了,但发现目前在WP平台的音频播放应用多多少少会有一些瑕疵,所以在此给大家在此介绍下这个功能给有需要的朋友们. 首先介绍下我们的应用在后台播放 ...