我想仅通过用户名授权用户,而忽略任何密码。用户名是许可证 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;
}
您将想要评论/删除它们。允许您使用任何密码(包括将框留空)进行身份验证。
因此,一旦您保存并将这些更改应用到文件,您将需要编译它。
这是使用apxs2
unix 上的 : 命令完成的。
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"