我有单独的用户和域表。当某个域被标记为不活动时,我希望该域的所有用户都无法通过身份验证。
这个查询工作正常。
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
通过执行以下操作解决了该问题。
通过在 dovecot.conf 中取消注释来启用 auth-deny.conf.ext
更改 auth-deny.conf.ext 以使用 sql 驱动程序并添加一个新文件作为 arg。
在新文件中添加了另一个 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'
是身份验证失败的原因。但它确实有效。有人有更好的方法吗?