nginx增加自定义账号鉴权

使用nginx反向代理实现

当一个站点内部程序是个黑盒(无法修改里面的请求逻辑),如何增加自己的账号系统鉴权

实现逻辑

  • 使用nginx的反向代理功能
  • 自定义账号系统增加两个接口,一个页面(为避免路径冲突,增加了"/xuxiaocong",根据自己需求修改)
    • 账号接口:POST "/xuxiaocong/login",接收用户名和密码,输入正确则生成token
    • 鉴权接口:GET "/xuxiaocong/auth",读取cookie中的token,验证其有效性,有效返回200状态码,无效返回401状态码
    • 登录页面:GET "/xuxiaocong/login",登录页面,填写用户名和密码,将token写入cookie

效果

  • 用户访问站点
  • 触发/auth鉴权,token无效时,跳转自定义登录页面
  • 登录成功后刷新页面,进入源站点
  • 当token失效时,会重新弹出登录页面
  • 如果源站点也有自己的账号,则需要输入两个账号密码,双重认证

demo目录结构

  • root # 根目录

    • static # 静态文件(flask框架)

      • xuxiaocong

        • axios.min.js
        • axios.min.map
    • templates # 页面(flask框架)
      • login.html # 登录页面
    • main.py
    • requirements.txt

nginx配置

  • 代理时增加鉴权(验证cookie)
  • 无权限时跳转ATP的login页面
  • 验证成功后cookie记录token,跳转回原页面
  • 由于原页面可能会有路径冲突,将路径命名为"/xuxiaocong"这样比较拗口的路径
  • 实际项目路径中可增加guid等方式降低重复可能
  • 所有符合设置的路径都需要鉴权(调用/xuxiaocong/auth接口),一定注意接口的高性能
server {
listen 80;
listen [::]:80;
server_name localhost; location / { # 这里做演示,所有请求都需要鉴权,实际项目注意过滤条件
proxy_pass http://www.damengsanqian.com/; # 代理需要鉴权的站点
proxy_set_header X-Original-URI $request_uri;
auth_request /xuxiaocong/auth; # 鉴权接口
error_page 401 /xuxiaocong/login; # 401跳转登录页面
} # 路径代理
location /xuxiaocong {
proxy_pass http://localhost:5000/xuxiaocong;
auth_request off; # 该路径禁用鉴权
} # 静态文件路径代理(flask框架限制)
location /static/xuxiaocong {
proxy_pass http://localhost:5000/static/xuxiaocong;
auth_request off; # 该路径禁用鉴权
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

代码(Python)

开头所说的两个接口一个页面,用其他语言实现

  • /requirements.txt
flask
  • /main.py
import json
from flask import Flask, request, make_response, render_template app = Flask(__name__) # 登录,GET获取页面,POST验证账号密码并返回token
@app.route('/xuxiaocong/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
resp = make_response(render_template('login.html'), 200)
return resp
else:
# 获取post数据
data = json.loads(request.get_data())
username = data.get('username')
password = data.get('password')
if username == '1' and password == '1':
return '7cp4VkZ3Nju1AOjy', 200
else:
return '账号或密码错误', 400 # 鉴权
@app.route('/xuxiaocong/auth')
def auth():
token = request.cookies.get('xuxiaocong_token')
# 模拟校验token
# time.sleep(1)
if token == '7cp4VkZ3Nju1AOjy':
return '200', 200
else:
return '无token或token失效', 401
  • /templates/login.html
<!DOCTYPE html>
<html> <head>
<title>Login</title>
<script src="{{ url_for('static',filename='xuxiaocong/axios.min.js') }}"></script>
</head> <body>
<h1>使用LCP/ATP账号登录</h1>
<p>这里是测试</p>
<p>账号:1</p>
<p>密码:1</p>
账号:<input type="text" name="username" id="username" />
<br />
密码:<input type="password" name="password" id="password" />
<br />
<input type="button" onclick="token()" value="登录" />
<script>
function token() {
const username = document.getElementById("username").value
const password = document.getElementById("password").value
axios.post('/xuxiaocong/login', { username, password })
.then(function (response) {
//设置cookie
setCookie('xuxiaocong_token', response.data)
location.reload()
})
.catch(function (error) {
alert(`发生错误:${error.response.data}`)
}) }
function setCookie(name, value) {
const Days = 30;
const exp = new Date();
exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
}
</script>
</body> </html>

项目

pip --default-timeout=200 install -r requirements.txt
set FLASK_APP=main
set FLASK_ENV=development
flask run -p 5000
# 如果nginx使用docker时,需要使用localhost无法访问宿主机
# 使用ip启动程序
# nginx配置也需要使用ip
flask run -h 本机ip -p 5000

docker nginx

内容 地址
网站 http://localhost:8881
基本配置 /etc/nginx/nginx.conf
站点配置 /etc/nginx/conf.d/default.conf

常用命令

nginx -s reload
vi /etc/nginx/conf.d/default.conf rm -rf /etc/nginx/conf.d/default.conf
echo "" > /etc/nginx/conf.d/default.conf

nginx增加自定义账号鉴权的更多相关文章

  1. AOP自定义注解鉴权

    刚出来工作那会或者在学校的时候,经常听到说AOP(面向对象编程,熟称切面)的用途是日志.鉴权等.但是那会不会,后面学会了,又没有写博客记录,今天写给大伙,希望能帮到大家 一.学习目标:利用AOP+自定 ...

  2. 自定义分布式RESTful API鉴权机制

    微软利用OAuth2为RESTful API提供了完整的鉴权机制,但是可能微软保姆做的太完整了,在这个机制中指定了数据持久化的方法是用EF,而且对于用户.权限等已经进行了封装,对于系统中已经有了自己的 ...

  3. 搭建web之 服务器鉴权失败,请确认服务器已启用密码鉴权并且账号密码正确?

    实例化时,登录过程中出现 服务器鉴权失败! 这是由于密码错误所致! 第一种情况:原始随机密码 第一种情况,你没有修改密码,则可以直接查找原始密码: 过程详见官网 使用密码登录的前提条件 密码: 若用户 ...

  4. 使用auth_request模块实现nginx端鉴权控制

    使用auth_request模块实现nginx端鉴权控制 nginx-auth-request-module 该模块是nginx一个安装模块,使用配置都比较简单,只要作用是实现权限控制拦截作用.默认高 ...

  5. Shiro(4)默认鉴权与自定义鉴权

    =========默认鉴权======== 过滤链中定义: <!-- 过滤链定义 --> <property name="filterChainDefinitions&qu ...

  6. Spring Cloud注册中心Eureka设置访问权限并自定义鉴权页面

    原文:https://blog.csdn.net/a823007573/article/details/88971496 使用Spring Security实现鉴权 1. 导入Spring Secur ...

  7. springboot+security整合(3)自定义鉴权

    说明 springboot 版本 2.0.3源码地址:点击跳转 系列 springboot+security 整合(1) springboot+security 整合(2) springboot+se ...

  8. 使用SpringSecurity Oauth2.0实现自定义鉴权中心

    Oauth2.0是什么不在赘述,本文主要介绍如何使用SpringSecurity Oauth2.0实现自定义的用户校验 1.鉴权中心服务 首先,列举一下我们需要用到的依赖,本文采用的是数据库保存用户信 ...

  9. RESTful登录设计(基于Spring及Redis的Token鉴权)

    转载自:http://www.scienjus.com/restful-token-authorization/ http://m.blog.csdn.net/article/details?id=4 ...

  10. web开发常见的鉴权方式

    结合网上找的资料整理了一下,以下是web开发中常见的鉴权方法: 预备:一些基本的知识 RBAC(Role-Based Access Control)基于角色的权限访问控制(参考下面①的连接) l    ...

随机推荐

  1. PHP压缩二进制流转CSV文件

    接口返回的数据是二进制流,需先BASE64解码,再进行解压缩,压缩的文件格式为ZIP,需使用Inflater进行解压,即可得到文件. java demo: 转成PHP代码: 贴上 原始二进制流数据,需 ...

  2. redisTemplate类学习及理解

    List<Object> list = masterRedisTemplate.executePipelined((RedisCallback<Long>) connectio ...

  3. JavaScript 数字与字符串的加减乘除运算

    点击跳转 Tips: 除开字符串 + 数字的运算,会产生级联,其他情况下会将 String 转为 number 再进行数字运算. js 运算是从左到右的,所以一步一步来,不要跳步进行运算.

  4. Request processing failed;

    用 ssm 框架修改数据库数据时,出现了 Request processing failed; nested exception is org.mybatis.spring.MyBatisSystem ...

  5. 成都信息工程大学第八届校赛 H J 题解

    H. Bang Bang Keli Ba 题目大意 给定数组 \(a\) ,构造递增序列 \(b\) 和递减序列 \(c\) 且 \(a_i=b_i+c_i\) . 题解 下面证明解的存在性,存在性证 ...

  6. 物联网IOT定位技术详解

    早在15世纪,当人类开始探索海洋的时候,定位技术也随之催生.当时的定位方法十分粗糙,就是是运用航海图和星象图以确定自己的位置. 随着社会的进步和科技的发展,定位技术在技术手段.定位精度.可用性等方面均 ...

  7. log4j2.xml配置全部正确,但是控制台不能输出错误日志

    如果配置文件,确定都没有问题,那么可能是Logger的包引入的不对: private static Logger logger = LogManager.getLogger(TrainControll ...

  8. kubernetes弃用dockershim

    转载自:https://www.51cto.com/article/710688.html 前段时间,kubernetes推出了1.24版本,曾经轰动一时的docker弃用也正式实装了,这意味着1.2 ...

  9. Delphi 格式化函数Format、FormatDateTime与FormatFloat详解

    目录 Format函数 %d 代表一个整数 %u 代表一个无负号整数 %s 代表字符串 %f 代表浮点数(保留或凑够两位小数点 ) %g 代表浮点数(会去掉多余的 0) %n 代表浮点数(整数部分使用 ...

  10. Springboot+thymeleaf结合Vue,通过thymeleaf给vue赋值解决Vue的SEO问题

    前言 vue开发的项目有时候会有SEO的需求,由于vue是JavaScript框架,内容都在JavaScript和服务端,所以SEO效果很差.vue的服务端渲染又很难和现在成熟的springboot等 ...