авторизация apache2 dbd без аутентификации

Я хотел бы авторизовать пользователей только по имени пользователя, игнорируя любые пароли. Имя пользователя - это идентификатор лицензии. Если он у вас есть, вы можете получить доступ к сайту, иначе нет.

Система теперь работает на Apache 2. 2 с помощью mod_auth_mysql , установив AuthMySQLNoPasswd на .

Теперь я пытаюсь выполнить обновление до 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/

Похоже, что anon на самом деле не аутентифицирует пользователей, чтобы сделать их доступными для авторизации dbd .

Я знаю о mod_wsgi , но мне нужно решение со стандартными модулями apache2. Я не хочу устанавливать Python.

2
задан 14 January 2017 в 03:39
2 ответа

Насколько мне известно, эта функция просто недоступна в текущих стандартных модулях.

Так что, если вы не хотите устанавливать 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

add:

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
ответ дан 3 December 2019 в 10:36

Я предполагаю, что вам также понадобится что-то вроде этих строк:

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

Require dbd-login
AuthzDBDQuery "UPDATE authn SET login = 'true' WHERE user = %s"
1
ответ дан 3 December 2019 в 10:36

Теги

Похожие вопросы