根据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第三方库


热门话题
java如何在sqlite数据库中保存特定列的历史记录   java如何更改/更新timeseriechart名称(JFreeChart)   java如何将整数转换为可绘制的   汇编什么解释Java的字节码   java查找已编译的类版本号   我应该什么时候在ColdFusion应用程序中使用Java?   java当一个实体的两个字段为(unique=true)时,如何处理JPA异常?   java为什么在所有其他实例都正确的情况下返回错误的布尔值?   java Hibernate每次都准备语句   java停留在平均字长上   对Java和日语字符进行编码   java如何将导致异常的方法的错误消息传递给侦听器中的onTestFailure方法   java代码没有打印结果   java为什么私有内部接口的方法必须是公共的?   休眠发生错误。有关详细信息,请参阅错误日志。JAVAlang.NullPointerException