Dovecot SQL password_query UNION

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、user 和密码变量时才有效。

谢谢

答案1

通过执行以下操作解决了该问题。

  1. 通过在 dovecot.conf 中取消注释来启用 auth-deny.conf.ext

  2. 更改 auth-deny.conf.ext 以使用 sql 驱动程序并添加一个新文件作为 arg。

  3. 在新文件中添加了另一个 password_query,其中包含以下返回deny变量的代码

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

这似乎有点儿像黑客行为,日志中说这Password query must return a field named 'password'是身份验证失败的原因。但它确实有效。有人有更好的方法吗?

相关内容