apache2 dbd 授权无需身份验证

apache2 dbd 授权无需身份验证

我想仅通过用户名授权用户,而忽略任何密码。用户名是许可证 ID。如果您有它,则可以访问该网站,否则则不能。

该系统目前在 Apache 2.2 上运行,修改mysql配置通过设置AuthMySQLNoPasswd On

现在我正在尝试升级到 Apache 2.4 并使用修改权限我不想做任何数据库身份验证,所以我想到使用mod_authn_anon对任何用户进行身份验证,然后进行授权数据库。配置如下:

AuthType basic
AuthName "Please use license ID as user name, password is irrelevant"
AuthBasicProvider anon
Anonymous_NoUserID on

# "authorized" is the name of an imaginary group that is returned by AuthzDBDQuery
# when username matches license ID in the database
Require dbd-group authorized
AuthzDBDQuery "select 'authorized' from user_info where user_name = %s"

以下是日志的相关部分:

mod_authz_core.c(809): AH01626: authorization result of Require dbd-group authorized: denied (no authenticated user yet)
mod_authz_core.c(809): AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
auth_basic:error] AH01618: user id not found: /protected/

看起来不久实际上并没有对用户进行身份验证数据库授权。

我知道mod_wsgi但我想要一个带有标准 apache2 模块的解决方案。我不想安装 Python。

答案1

据我所知,此功能在当前标准模块中不可用。

所以如果您不想安装 python,您很可能需要稍微更改代码。

如果您只想通过用户名来验证用户,您可以通过编辑 mod_authn_dbd.c 来实现。

该文件可在 Apache Github 帐户上获取,以下是其链接:修改配置文件

应该突出显示第 183-187 行:

    rv = apr_password_validate(password, dbd_password);

    if (rv != APR_SUCCESS) {
      return AUTH_DENIED;
    }

您将想要评论/删除它们。允许您使用任何密码(包括将框留空)进行身份验证。

因此,一旦您保存并将这些更改应用到文件,您将需要编译它。

这是使用apxs2unix 上的 : 命令完成的。

    sudo apxs2 -iac mod_authn_dbd.c

它将编译它并随后自动激活它。

如果您在运行此命令时遇到问题,则可能是缺少 httpd-devel(centos)或 apache2-dev(ubuntu)。

现在在您的配置文件中,删除:

   AuthBasicProvider anon
   Anonymous_NoUserID on

添加 :

AuthBasicProvider dbd
Require valid-user

 # mod_authn_dbd SQL query to authenticate a user
 AuthDBDUserPWQuery "select user_name from user_info where user_name = %s"

因此,您上面发布的配置应如下所示:

AuthType basic
AuthName "Please use license ID as user name, password is irrelevant"
AuthBasicProvider dbd
Require valid-user 

# mod_authn_dbd SQL query to authenticate a user
 AuthDBDUserPWQuery "select user_name from user_info where user_name = %s"

# "authorized" is the name of an imaginary group that is returned by AuthzDBDQuery
# when username matches license ID in the database 
Require dbd-group authorized
AuthzDBDQuery "select 'authorized' from user_info where user_name = %s"

然后,您将能够仅使用许可证号来验证您的用户,并执行您需要使用 authz 执行的任何操作。

尽管如此,我真的希望有另一种不太复杂且更方便的解决方案。

请记住,这样做之后,如果您需要此模块正常运行,那么您将再次遇到另一个或相同的问题需要解决。

祝你好运!

答案2

我认为你也需要类似这样的东西:

AuthDBDUserPWQuery "SELECT '' FROM authn WHERE user = %s AND login = 'true'"

Require dbd-login
AuthzDBDQuery "UPDATE authn SET login = 'true' WHERE user = %s"

相关内容