Я хочу авторизовать пользователей только по имени пользователя, игнорируя любые пароли. Имя пользователя - это идентификатор лицензии. Если он у вас есть, вы можете получить доступ к сайту, иначе нет.
Теперь система работает на Apache 2.2 с mod_auth_mysql установив AuthMySQLNoPasswd On
.
Теперь я пытаюсь перейти на Apache 2.4 и использовать mod_authz_dbd. Я не хочу ничего делать dbd аутентификации, поэтому я подумал об использовании mod_authn_anon для аутентификации любого пользователя, а затем авторизации с dbd. Вот конфигурация:
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/
Кажется, что анон фактически не аутентифицирует пользователей, чтобы они были доступны для dbd авторизация.
Я знаю о mod_wsgi но я хотел бы решение со стандартными модулями apache2. Я не хочу устанавливать Python.
AFAIK эта функция просто недоступна в текущих стандартных модулях.
Поэтому, если вы не хотите устанавливать python, вам, скорее всего, придется немного изменить код.
Если вы хотите аутентифицировать пользователей только по имени пользователя, вы можете сделать это, отредактировав mod_authn_dbd.c.
Этот файл доступен в учетной записи Apache Github, и вот ссылка на него: mod_authn_dbd.c .
Должны быть выделены строки 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.
Тем не менее, я очень надеюсь, что есть другое, менее сложное и более удобное решение.
Имейте в виду, что, сделав это, если вам когда-либо понадобится этот модуль для правильной работы, вам снова придется решать другую или ту же проблему.
Удачи!
Я предполагаю, что вам также нужно что-то в этом роде:
AuthDBDUserPWQuery "SELECT '' FROM authn WHERE user = %s AND login = 'true'"
Require dbd-login
AuthzDBDQuery "UPDATE authn SET login = 'true' WHERE user = %s"