根据sql数据库验证nginx请求

ws.nginxdbauth的Python项目详细描述


这个包通过查找 数据库中的用户/密码(mysql,postgresql,随便什么sqlalchemy) 支持)。

用法

配置数据库访问

您需要使用配置文件提供DSN和查询:

[default]
dsn = postgresql://localhost/myusers
query = SELECT password FROM users WHERE username = :username AND password = :password AND role = :x_required_role
password_hash = bcrypt

有关支持的DSN,请参阅sqlalchemy documentation。注意你必须 安装相应的驱动程序python包(mysql-pythonpsycopg2, 等)你自己。

查询作为sql参数传递基本authusernamepassword以及任何请求头(小写,和-替换 使用_)。(如果你的用途不够灵活,你就必须 暂时使用专门的查询运行单独的实例)。

查询必须返回用户的哈希密码。因为对于简单的情况 使用数据库提供的sql函数 散列密码(例如mysqlWHERE password=encrypt(:password, password)), 但是您也可以将passlib支持的任何散列指定为 password_hash在python中执行比较(这就是为什么我们需要 从数据库中存储的密码哈希)。你需要pip install passlib 使用此功能。

设置http服务

然后您需要设置一个http服务器,或者使用一个专用进程:

$ nginx-db-auth-serve --host localhost --port 8899 --config /path/to/config

或者作为一个cgi脚本,如果你有基础设施的话。 下面是一个apache配置片段示例:

ScriptAlias /nginx-auth /path/to/nginxdbauth/nginx-db-auth-cgi
<Location /nginx-auth>
  SetEnv NGINXDBAUTH_CONFIG /path/to/config
  CGIPassAuth On  # apache >= 2.4.13
  # SetEnv NGINXDBAUTH_LOGFILE /path/to/log  # optional, for debugging
</Location>

配置nginx

现在您可以设置一个受保护的nginx位置,如下所示:

location /private/ {
    auth_request /auth;
    # ... define rest of location ...
}

location = /auth {
    proxy_pass http://localhost:8899;  # or http://mycgi/nginx-auth
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Required-Role "superuser";
    proxy_set_header WWW-Authenticate "my realm";
}

nginx发送的WWW-Authenticate头将简单地在401上回显 请求(据我所知,nginx不提供在auth_requestcase中设置领域字符串的另一种方法)。

更改

1.0.2(2018-03-28)

  • 回显401个响应的www authenticate头。

1.0.1(2018-03-28)

  • 启用将错误记录到文件以调试CGI脚本。

1.0.0(2018-03-27)

  • 第一次释放。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Android应用程序中处理新活动时出现java NullPointerException   从PSV文件读取Java   在JavaSwing中将方法从一个类传递到另一个类   带有MongoDB错误的java Vertx ClassNotFoundException:com。mongodb。联系溪流工厂   在java中替换2D数组中的数字?   java Avro方案空布尔和双整数布尔的写并集   java导入组织。neo4j无法解决?   从另一个获取变量。使用反射的java文件   Java:以格式化字符串的形式返回具有非常不同的条目长度的2D数组   java客户端应用程序正在从IBMMQ接收不同格式的消息体   java在我的主循环中的步骤有问题   java如何正确安装来自sslforfree的证书。tomcat服务器上的com   java RecyclerView变更单永久   java如何获得屏幕的精确中间位置,即使调整了大小