在做网站后台时大家可能考虑比较多就是权限如何验证、浏览器在登陆后如何持续验证权限和权限过滤,那些路径能访问、那些不可以。
此贴使用fastweb服务实现登录鉴权功能。
=====登录验证 [login.lua]=======================
获取请求信息,查询数据库并设置会话权限
require("website")
function login()
local username = param_throw("username")
local password = param_throw("password")
-- 验证账号格式
if string.len(username) < 4 or string.len(username) > 32 then
reply(201,"账号长度为4~32")
return
end
-- 验证密码格式
if string.len(password) < 4 or string.len(password) > 32 then
reply(201,"密码长度为4~32")
return
end
-- 查询MYSQL users表
-- 此处的mysql变量为 init.lua 中注册的应用全局变量
local result = mysql:select():table("users"):field({"id"}):where_str("username","=",username):where_str("password","=",password):query()
if result:row_count() ~= 1 then
reply(201,"账号或密码错误")
return
end
result:next()
local id = result:get("id")
-- 获取session会话对象
local session = session()
-- 验证session是否有效
if session:check() == false then
-- 初始化session
-- make_software_guid() 是 fastweb 提供的获取应用唯一ID字符串的函数方法(跨网站唯一请勿使用)
session:init(request,make_software_guid())
end
-- 更新登录状态
-- 保存ID到该会话中
session:set("id",tostring(result:get("id")))
-- 取出session的ID为会话token,浏览器以后需要携带此协议头请求服务器,方便验证权限
reply(200,"",{token=session:id()})
end
function access()
-- 获取请求类型(无参抛异常)
local action = param_throw("action")
if action == "login" then
login()
end
end
=====拦截器 [interceptor.lua]=======================
过滤/scripts的API请求,判断是否登录决定允许或拒绝向下执行
require ("website")
-- 跳转到登录页面
function goto_login_page()
-- 重定向
response:redirect("/page/login.html",true)
end
function access()
-- 判断是否为公共开放接口目录
if string.sub(request:filepath(),1,16) == "/scripts/public/" then
--公共开放接口,允许访问无需校验权限
return true
end
-- 获取token
if request:token() == "" then
-- 无TOKEN说明未登录,重定向到登录页
goto_login_page()
return false
end
-- 校验session
local session =session()
if session:check() == false or session:get("id") == "" then
-- SESSION已过期
goto_login_page()
return false
end
-- session验证通过,允许继续访问执行
return true
end
===== 网页代码 [login.html]=======================
$.ajax({
url: "/scripts/public/user.lua?action=login",
type: "POST",
contentType: "application/json",
dataType: "json",
data: JSON.stringify(requestData),
success: function(response) {
if(response.code == 200){
localStorage.setItem('token',response.data.token);
// 全局设置 AJAX 请求头部
$.ajaxSetup({
beforeSend: function(xhr) {
var token = localStorage.getItem('token');
if (token) {
xhr.setRequestHeader('token', token);
}
}
});
window.location = '../index.html';
}else{
layer.msg(response.msg);
}
}
});
获取示例代码可以查看该贴:Lua是怎么实现网站开发的?-CSDN博客