Dovecot SQL password_query UNION

У меня есть разделите таблицы пользователей и доменов. Когда домен помечен как неактивный, я хочу, чтобы все пользователи этого домена не прошли аутентификацию.

Этот запрос работает нормально.

password_query = \
         SELECT CONCAT("5500") AS gid,  CONCAT("5500") AS uid, \
         CONCAT("/mail/dir/",'%d','/','%n') AS home,Email as User, Password as password \
         FROM users_table  WHERE Email='%u' AND active=1;

Теперь я пытаюсь добавить проверку, чтобы увидеть, домен помечен как активный. Добавление SELECT DomainName FROM domains_table UNION . (который я расширю позже) Но когда я добавлю это, запрос не будет выполнен. Имена таблиц и заголовки верны. Почему эта строка может вызвать запрос на сбой?

Кроме того, поддерживаются ли здесь условные операторы? Я хотел бы добавить IF (домен активен) THEN (передать запрос)

password_query = \
         SELECT DomainName FROM domains_table \
         UNION SELECT CONCAT("5500") AS gid,  CONCAT("5500") AS uid, \
         CONCAT("/mail/dir/",'%d','/','%n') AS home,Email as User, Password as password \
         FROM users_table  WHERE Email='%u' AND active=1;

Кажется, что каждый запрос работает, только если они возвращают gid, uid, home, переменные пользователя и пароля.

Спасибо

0
задан 23 June 2021 в 08:48
1 ответ

Решил проблему, выполнив следующие действия.

  1. Включен auth-deny.conf.ext, раскомментировав его в dovecot.conf

  2. Измените auth-deny.conf.ext, чтобы использовать драйвер sql, и добавьте новый файл как arg.

  3. в новый файл добавлен еще один password_query со следующим кодом, который возвращает переменную deny

    password_query =
    SELECT ('% u') AS deny FROM domain_table WHERE DomainName = '% d' AND active = 0;

Это похоже на взлом, в журналах написано Запрос пароля должен возвращать поле с именем 'password' было причиной сбоя аутентификации . Но это действительно работает. У кого-нибудь есть способ лучше?

0
ответ дан 28 July 2021 в 14:37

Теги

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